KERAS, заколебал меня установкой, но я сделал это
Всем привет, крайний маркдаун библиотеки от меня за курс. Разберем Керасин, авиакерасин, как топливо для глубинного погружения.
Лайфхак по установке, ох, не представляете Вы себе, сколько я его мучал или он меня мучал: 1) Заходим на Змею, Анаконду, регистрируемся, внизу, в самом низу, крутите до конца, будет вкладка “Загрузить Дау..”,кхе-кхе, шучу, простите, Download. 2) Качаем и ставим Анаконду для Python 3.6. 3) Открываем RStudio 5) Простой вариант:
Попросит кучу всего доставить, соглашайтесь, это не больно. 6) Вариант для мазахистов, как я, если начинает жаловаться, что че-то не найдено или keras python not found
Все равно жалуется? Бывает, заходим в Гугл ищем Майкрософт Визуал С, он не может найти MWCP140 или как там его, забыл, MVWCP140.dll
Должен поставиться. Ну или Вы совсем вредный человек.
Керас и с чем его пинают В общем, библиотека жесть какая мощная, разберу на примере, того, как Сенсей рассказывал про него:
Начнем с датасета с Бостонскими данными:
'data.frame': 506 obs. of 14 variables:
$ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
$ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
$ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
$ chas : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
$ rm : num 6.58 6.42 7.18 7 7.15 ...
$ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
$ dis : num 4.09 4.97 4.97 6.06 6.06 ...
$ rad : num 1 2 2 3 3 3 5 5 5 5 ...
$ tax : num 296 242 242 222 222 222 311 311 311 311 ...
$ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
$ b : num 397 397 393 395 397 ...
$ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
$ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
Зависимой переменной провозгласим “Medv”.
На вход Керас принимает только матрицы, без названия измерений (dimensions)
Пилим бюдж.., кхе-кхе, данные, простите, повторяюсь:
Вот нормализация: Есть несколько способов, в том числе, который был изложен в каретке, который использовал Сенсей, но и Керасинки есть свои функции, давайте попробуем
train <- normalize(train)
test <- normalize(test)
Проще, согласитель, юзайте normalize, только normalize юзайте его. Варик от Сенсея:
Моделька, не не, подождите, пока. Есть в керасинке, любимый Ван - хот Энкодинг
Мутим модельку
Сначала сделаем среду, она универсальна для всех типов моделей, которые Вы пожелаете строить при помощи Кераса
Мутим структуру модели:
Тут Важно, методы активации:
Определим ошибки и метрики исчисления эффективности модели:
Loss’ы и метрики: #Могу ошибиться, соррян
Оффтопчик: Кросс-энтропия обычно используется для количественной оценки разницы между двумя распределениями вероятностей. Обычно «истинный» дистрибутив (тот, который ваш алгоритм обучения машине пытается сопоставить) выражается в терминах одноразового распределения (Гугл транслейт).
Метрики, основная метрика - точность (Accuracy), далее возможные в Керасинке вариации:
Оптимайзеры:
SGD - Оптимизатор стохастического градиентного спуска.Включает поддержку импульса, разрыва скорости обучения и импульса Нестерова. Гугл транслейт матерится.
RMSprop - рекомендуется оставить параметры этого оптимизатора по умолчанию (кроме скорости обучения, которую можно свободно настраивать).
Adagrad - это оптимизатор с определенными параметрами обучения, которые адаптируются относительно того, как часто параметр обновляется во время обучения. Чем больше обновлений получает параметр, тем меньше обновлений. Рекомендуется оставить параметры этого оптимизатора по умолчанию.
Adadelta - более надежное расширение Adagrad, которое адаптирует скорости обучения на основе движущегося окна обновлений градиента, вместо того, чтобы накапливать все градиенты прошлого. Таким образом, Adadelta продолжает обучение, даже когда сделано много обновлений. По сравнению с Adagrad, в оригинальной версии Adadelta вам не нужно устанавливать начальную скорость обучения. В этой версии можно установить начальную скорость обучения и коэффициент распада, как и в большинстве других оптимизаторов Keras.
Adam - метод стохастической оптимизации.
Adamax - навороченный Адам.
Nadam - Адам от Нестерова.
TFOptimizer - штука от Tensorflow.
Модееееелька:
mymodel <- model %>%
fit(train,
traintarget,
epochs = 100,
batch_size = 32,
validation_split = 0.2)
Оцениваем результаты и предиктуем (прогнозируем или предсказываем - для экстрасенсов, наверное):
$loss
[1] 650.3524
$mean_absolute_error
[1] 23.03027
[1] 23.03027
Caret - Чит библиотека
Всем привет, снова, с “сортирным”, пардоньте, юмором. Рассмотрим сегодня библиотеку Карет. Карет - все для Машин Лёрнинг.
Небольшая ремарка:
Caret - Classification And REgression Training.
Ну, если о серьезном, помимо других функций, можно выделить основные их виды:
Установка CRAN версии, как Мерседес с салона:
Установка AMG версии, с GitHub:
Пойдем по основным функциям
Думали все? Так просто, нееее
CreateResample - функция, которая создает 1 и более сэмплов-вариантов начальной загрузки, по определенной переменной.
Попробуем?
Resample01 Resample02 Resample03 Resample04 Resample05 Resample06
[1,] 2 1 2 2 1 2
[2,] 2 3 3 2 2 3
[3,] 8 5 3 2 2 4
[4,] 9 5 4 4 2 4
[5,] 9 5 5 6 5 6
[6,] 12 6 8 7 7 6
[7,] 13 6 11 8 7 7
[8,] 15 7 11 8 8 9
[9,] 17 10 12 9 9 9
[10,] 18 10 12 9 10 10
[11,] 19 12 19 13 12 11
[12,] 19 13 19 13 13 12
[13,] 20 13 20 14 13 13
[14,] 20 13 20 16 14 13
[15,] 21 15 20 17 18 13
[16,] 22 17 20 20 19 14
[17,] 22 17 22 20 20 16
[18,] 22 17 22 21 20 17
[19,] 24 18 22 21 21 18
[20,] 24 18 22 21 21 20
[21,] 25 19 24 24 22 21
[22,] 25 20 26 24 22 21
[23,] 26 21 26 26 26 22
[24,] 27 22 26 26 26 22
[25,] 29 23 26 27 27 23
[26,] 29 24 27 27 27 25
[27,] 29 25 27 29 27 26
[28,] 30 25 28 30 28 27
[29,] 30 25 28 31 28 29
[30,] 31 30 30 32 31 30
[31,] 32 31 30 32 32 31
[32,] 32 32 31 32 32 31
Resample07 Resample08 Resample09 Resample10
[1,] 2 2 1 1
[2,] 7 2 1 1
[3,] 8 4 1 1
[4,] 9 5 2 3
[5,] 10 6 3 4
[6,] 10 7 4 4
[7,] 10 8 4 4
[8,] 11 9 6 4
[9,] 11 10 7 6
[10,] 12 10 7 7
[11,] 15 10 7 9
[12,] 15 11 8 10
[13,] 16 13 10 11
[14,] 17 14 11 15
[15,] 17 15 14 16
[16,] 18 16 15 16
[17,] 18 17 15 16
[18,] 20 17 16 18
[19,] 20 20 16 19
[20,] 22 21 17 20
[21,] 22 23 18 21
[22,] 26 24 18 22
[23,] 27 27 19 26
[24,] 27 27 20 26
[25,] 27 27 21 27
[26,] 28 28 23 30
[27,] 29 29 23 30
[28,] 29 30 24 32
[29,] 30 30 28 32
[30,] 30 31 29 32
[31,] 31 31 32 32
[32,] 31 31 32 32
createFolds - разделяет данные на К группы, хз пока, что значит К - но, думаю, приблизительно по К - соседям.
$Fold01
[1] 9 10 11
$Fold02
[1] 19 21 29
$Fold03
[1] 14 30 31
$Fold04
[1] 5 20 25 26
$Fold05
[1] 4 22
$Fold06
[1] 7 18 27
$Fold07
[1] 3 8 12 15
$Fold08
[1] 17 23 32
$Fold09
[1] 16 24 28
$Fold10
[1] 1 2 6 13
Вот ща поинтереснее будет, помните Тайм-сериес данные? есть функция, которая может поделить их по датам для кросс-валидации:
$train
$train$Training005
[1] 1 2 3 4 5
$train$Training006
[1] 2 3 4 5 6
$train$Training007
[1] 3 4 5 6 7
$train$Training008
[1] 4 5 6 7 8
$train$Training009
[1] 5 6 7 8 9
$train$Training010
[1] 6 7 8 9 10
$train$Training011
[1] 7 8 9 10 11
$train$Training012
[1] 8 9 10 11 12
$train$Training013
[1] 9 10 11 12 13
$train$Training014
[1] 10 11 12 13 14
$train$Training015
[1] 11 12 13 14 15
$train$Training016
[1] 12 13 14 15 16
$train$Training017
[1] 13 14 15 16 17
$train$Training018
[1] 14 15 16 17 18
$train$Training019
[1] 15 16 17 18 19
$train$Training020
[1] 16 17 18 19 20
$train$Training021
[1] 17 18 19 20 21
$train$Training022
[1] 18 19 20 21 22
$train$Training023
[1] 19 20 21 22 23
$train$Training024
[1] 20 21 22 23 24
$train$Training025
[1] 21 22 23 24 25
$train$Training026
[1] 22 23 24 25 26
$train$Training027
[1] 23 24 25 26 27
$train$Training028
[1] 24 25 26 27 28
$train$Training029
[1] 25 26 27 28 29
$train$Training030
[1] 26 27 28 29 30
$train$Training031
[1] 27 28 29 30 31
$train$Training032
[1] 28 29 30 31 32
$train$Training033
[1] 29 30 31 32 33
$train$Training034
[1] 30 31 32 33 34
$train$Training035
[1] 31 32 33 34 35
$train$Training036
[1] 32 33 34 35 36
$train$Training037
[1] 33 34 35 36 37
$train$Training038
[1] 34 35 36 37 38
$train$Training039
[1] 35 36 37 38 39
$train$Training040
[1] 36 37 38 39 40
$train$Training041
[1] 37 38 39 40 41
$train$Training042
[1] 38 39 40 41 42
$train$Training043
[1] 39 40 41 42 43
$train$Training044
[1] 40 41 42 43 44
$train$Training045
[1] 41 42 43 44 45
$train$Training046
[1] 42 43 44 45 46
$train$Training047
[1] 43 44 45 46 47
$train$Training048
[1] 44 45 46 47 48
$train$Training049
[1] 45 46 47 48 49
$train$Training050
[1] 46 47 48 49 50
$train$Training051
[1] 47 48 49 50 51
$train$Training052
[1] 48 49 50 51 52
$train$Training053
[1] 49 50 51 52 53
$train$Training054
[1] 50 51 52 53 54
$train$Training055
[1] 51 52 53 54 55
$train$Training056
[1] 52 53 54 55 56
$train$Training057
[1] 53 54 55 56 57
$train$Training058
[1] 54 55 56 57 58
$train$Training059
[1] 55 56 57 58 59
$train$Training060
[1] 56 57 58 59 60
$train$Training061
[1] 57 58 59 60 61
$train$Training062
[1] 58 59 60 61 62
$train$Training063
[1] 59 60 61 62 63
$train$Training064
[1] 60 61 62 63 64
$train$Training065
[1] 61 62 63 64 65
$train$Training066
[1] 62 63 64 65 66
$train$Training067
[1] 63 64 65 66 67
$train$Training068
[1] 64 65 66 67 68
$train$Training069
[1] 65 66 67 68 69
$train$Training070
[1] 66 67 68 69 70
$train$Training071
[1] 67 68 69 70 71
$train$Training072
[1] 68 69 70 71 72
$train$Training073
[1] 69 70 71 72 73
$train$Training074
[1] 70 71 72 73 74
$train$Training075
[1] 71 72 73 74 75
$train$Training076
[1] 72 73 74 75 76
$train$Training077
[1] 73 74 75 76 77
$train$Training078
[1] 74 75 76 77 78
$train$Training079
[1] 75 76 77 78 79
$train$Training080
[1] 76 77 78 79 80
$train$Training081
[1] 77 78 79 80 81
$train$Training082
[1] 78 79 80 81 82
$train$Training083
[1] 79 80 81 82 83
$train$Training084
[1] 80 81 82 83 84
$train$Training085
[1] 81 82 83 84 85
$train$Training086
[1] 82 83 84 85 86
$train$Training087
[1] 83 84 85 86 87
$train$Training088
[1] 84 85 86 87 88
$train$Training089
[1] 85 86 87 88 89
$train$Training090
[1] 86 87 88 89 90
$train$Training091
[1] 87 88 89 90 91
$train$Training092
[1] 88 89 90 91 92
$train$Training093
[1] 89 90 91 92 93
$train$Training094
[1] 90 91 92 93 94
$train$Training095
[1] 91 92 93 94 95
$train$Training096
[1] 92 93 94 95 96
$train$Training097
[1] 93 94 95 96 97
$train$Training098
[1] 94 95 96 97 98
$train$Training099
[1] 95 96 97 98 99
$train$Training100
[1] 96 97 98 99 100
$train$Training101
[1] 97 98 99 100 101
$train$Training102
[1] 98 99 100 101 102
$train$Training103
[1] 99 100 101 102 103
$train$Training104
[1] 100 101 102 103 104
$train$Training105
[1] 101 102 103 104 105
$train$Training106
[1] 102 103 104 105 106
$train$Training107
[1] 103 104 105 106 107
$train$Training108
[1] 104 105 106 107 108
$train$Training109
[1] 105 106 107 108 109
$train$Training110
[1] 106 107 108 109 110
$train$Training111
[1] 107 108 109 110 111
$train$Training112
[1] 108 109 110 111 112
$train$Training113
[1] 109 110 111 112 113
$train$Training114
[1] 110 111 112 113 114
$train$Training115
[1] 111 112 113 114 115
$train$Training116
[1] 112 113 114 115 116
$train$Training117
[1] 113 114 115 116 117
$train$Training118
[1] 114 115 116 117 118
$train$Training119
[1] 115 116 117 118 119
$train$Training120
[1] 116 117 118 119 120
$train$Training121
[1] 117 118 119 120 121
$train$Training122
[1] 118 119 120 121 122
$train$Training123
[1] 119 120 121 122 123
$train$Training124
[1] 120 121 122 123 124
$train$Training125
[1] 121 122 123 124 125
$train$Training126
[1] 122 123 124 125 126
$train$Training127
[1] 123 124 125 126 127
$train$Training128
[1] 124 125 126 127 128
$train$Training129
[1] 125 126 127 128 129
$train$Training130
[1] 126 127 128 129 130
$train$Training131
[1] 127 128 129 130 131
$train$Training132
[1] 128 129 130 131 132
$train$Training133
[1] 129 130 131 132 133
$train$Training134
[1] 130 131 132 133 134
$train$Training135
[1] 131 132 133 134 135
$train$Training136
[1] 132 133 134 135 136
$train$Training137
[1] 133 134 135 136 137
$train$Training138
[1] 134 135 136 137 138
$train$Training139
[1] 135 136 137 138 139
$train$Training140
[1] 136 137 138 139 140
$train$Training141
[1] 137 138 139 140 141
$train$Training142
[1] 138 139 140 141 142
$train$Training143
[1] 139 140 141 142 143
$test
$test$Testing005
[1] 6
$test$Testing006
[1] 7
$test$Testing007
[1] 8
$test$Testing008
[1] 9
$test$Testing009
[1] 10
$test$Testing010
[1] 11
$test$Testing011
[1] 12
$test$Testing012
[1] 13
$test$Testing013
[1] 14
$test$Testing014
[1] 15
$test$Testing015
[1] 16
$test$Testing016
[1] 17
$test$Testing017
[1] 18
$test$Testing018
[1] 19
$test$Testing019
[1] 20
$test$Testing020
[1] 21
$test$Testing021
[1] 22
$test$Testing022
[1] 23
$test$Testing023
[1] 24
$test$Testing024
[1] 25
$test$Testing025
[1] 26
$test$Testing026
[1] 27
$test$Testing027
[1] 28
$test$Testing028
[1] 29
$test$Testing029
[1] 30
$test$Testing030
[1] 31
$test$Testing031
[1] 32
$test$Testing032
[1] 33
$test$Testing033
[1] 34
$test$Testing034
[1] 35
$test$Testing035
[1] 36
$test$Testing036
[1] 37
$test$Testing037
[1] 38
$test$Testing038
[1] 39
$test$Testing039
[1] 40
$test$Testing040
[1] 41
$test$Testing041
[1] 42
$test$Testing042
[1] 43
$test$Testing043
[1] 44
$test$Testing044
[1] 45
$test$Testing045
[1] 46
$test$Testing046
[1] 47
$test$Testing047
[1] 48
$test$Testing048
[1] 49
$test$Testing049
[1] 50
$test$Testing050
[1] 51
$test$Testing051
[1] 52
$test$Testing052
[1] 53
$test$Testing053
[1] 54
$test$Testing054
[1] 55
$test$Testing055
[1] 56
$test$Testing056
[1] 57
$test$Testing057
[1] 58
$test$Testing058
[1] 59
$test$Testing059
[1] 60
$test$Testing060
[1] 61
$test$Testing061
[1] 62
$test$Testing062
[1] 63
$test$Testing063
[1] 64
$test$Testing064
[1] 65
$test$Testing065
[1] 66
$test$Testing066
[1] 67
$test$Testing067
[1] 68
$test$Testing068
[1] 69
$test$Testing069
[1] 70
$test$Testing070
[1] 71
$test$Testing071
[1] 72
$test$Testing072
[1] 73
$test$Testing073
[1] 74
$test$Testing074
[1] 75
$test$Testing075
[1] 76
$test$Testing076
[1] 77
$test$Testing077
[1] 78
$test$Testing078
[1] 79
$test$Testing079
[1] 80
$test$Testing080
[1] 81
$test$Testing081
[1] 82
$test$Testing082
[1] 83
$test$Testing083
[1] 84
$test$Testing084
[1] 85
$test$Testing085
[1] 86
$test$Testing086
[1] 87
$test$Testing087
[1] 88
$test$Testing088
[1] 89
$test$Testing089
[1] 90
$test$Testing090
[1] 91
$test$Testing091
[1] 92
$test$Testing092
[1] 93
$test$Testing093
[1] 94
$test$Testing094
[1] 95
$test$Testing095
[1] 96
$test$Testing096
[1] 97
$test$Testing097
[1] 98
$test$Testing098
[1] 99
$test$Testing099
[1] 100
$test$Testing100
[1] 101
$test$Testing101
[1] 102
$test$Testing102
[1] 103
$test$Testing103
[1] 104
$test$Testing104
[1] 105
$test$Testing105
[1] 106
$test$Testing106
[1] 107
$test$Testing107
[1] 108
$test$Testing108
[1] 109
$test$Testing109
[1] 110
$test$Testing110
[1] 111
$test$Testing111
[1] 112
$test$Testing112
[1] 113
$test$Testing113
[1] 114
$test$Testing114
[1] 115
$test$Testing115
[1] 116
$test$Testing116
[1] 117
$test$Testing117
[1] 118
$test$Testing118
[1] 119
$test$Testing119
[1] 120
$test$Testing120
[1] 121
$test$Testing121
[1] 122
$test$Testing122
[1] 123
$test$Testing123
[1] 124
$test$Testing124
[1] 125
$test$Testing125
[1] 126
$test$Testing126
[1] 127
$test$Testing127
[1] 128
$test$Testing128
[1] 129
$test$Testing129
[1] 130
$test$Testing130
[1] 131
$test$Testing131
[1] 132
$test$Testing132
[1] 133
$test$Testing133
[1] 134
$test$Testing134
[1] 135
$test$Testing135
[1] 136
$test$Testing136
[1] 137
$test$Testing137
[1] 138
$test$Testing138
[1] 139
$test$Testing139
[1] 140
$test$Testing140
[1] 141
$test$Testing141
[1] 142
$test$Testing142
[1] 143
$test$Testing143
[1] 144
И разделение по группам - groupKFold, разделение данных по групировочному фактору.
У Каретки есть оч классная функция preProc, внутри которой можно прописать метод препроцессинга данных, прежде чем пробовать нужно предостеречься от заболе, простите, рассмотрим методы препроцессинга:
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]
norm <- preProcess(mtcars, method = c("scale"))
mtcars <- predict(norm,mtcars)
hist(mtcars$disp)
hist(mtcars$disp)
mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]
norm <- preProcess(mtcars, method = c("range"))
mtcars <- predict(norm,mtcars)
hist(mtcars$disp)
hist(mtcars$disp)
mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]
norm <- preProcess(mtcars, method = c("center"))
mtcars <- predict(norm,mtcars)
hist(mtcars$disp)
hist(mtcars$disp)
mtcars <- mtcars[mtcars$disp<=mean(mtcars$disp)+sd(mtcars$disp),]
norm <- preProcess(mtcars, method = c("center","scale"))
mtcars <- predict(norm,mtcars)
hist(mtcars$disp)
в Каретке есть трансформеры, Оптимус прайм, кхм - кхм, шучу, БоксКокс, YeoJohnson, expoTrans:
БоксаКокса - мы помним, забористый, ой, не то. Возводит переменную в максимально возможную степень для максимально возможной корреляции:
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Box-Cox Transformation
32 data points used to estimate Lambda
Input data summary:
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.760 3.080 3.695 3.597 3.920 4.930
Largest/Smallest: 1.79
Sample Skewness: 0.266
Estimated Lambda: -0.1
With fudge factor, Lambda = 0 will be used for transformations
'data.frame': 32 obs. of 12 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp : num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec : num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear : num 4 4 4 3 3 3 3 4 4 4 ...
$ carb : num 4 4 1 1 2 1 4 2 2 4 ...
$ drat_new: num 1.36 1.36 1.35 1.12 1.15 ...
YeoJohnson - трансформация - навороченный БоксКокс,но учитывает в расчетах нулевые и отрицательные значения обрабатываемых переменных.
Created from 32 samples and 10 variables
Pre-processing:
- ignored (0)
- Yeo-Johnson transformation (10)
Lambda estimates for Yeo-Johnson transformation:
-0.02, 1.13, 0.22, 0.09, -0.32, 0.31, -0.24, -2.02, -0.18, 0.67
expoTrans - выполняет вычисление экспоненциальной функции.
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
mpg cyl disp hp drat wt
Mazda RX4 13.417122 8.342726 160.0 110 2.497286 2.144875
Mazda RX4 Wag 13.417122 8.342726 160.0 110 2.497286 2.309996
Datsun 710 14.068810 4.965118 108.0 93 2.478198 1.941892
Hornet 4 Drive 13.566682 8.342726 258.0 110 2.152231 2.520047
Hornet Sportabout 12.501135 12.504948 360.0 175 2.184508 2.652967
Valiant 12.245663 8.342726 225.0 105 1.997311 2.664554
Duster 360 10.451503 12.504948 360.0 245 2.211731 2.727636
Merc 240D 14.604113 4.965118 146.7 62 2.415501 2.504984
Merc 230 14.068810 4.965118 140.8 95 2.504854 2.480759
Merc 280 12.708661 8.342726 167.6 123 2.504854 2.652967
Merc 280C 12.115235 8.342726 167.6 123 2.504854 2.652967
Merc 450SE 11.481976 12.504948 275.8 180 2.147574 3.000930
Merc 450SL 11.893779 12.504948 275.8 180 2.147574 2.817453
Merc 450SLC 10.905456 12.504948 275.8 180 2.147574 2.845057
Cadillac Fleetwood 8.249779 12.504948 472.0 205 2.081144 3.566318
Lincoln Continental 8.249779 12.504948 460.0 215 2.114648 3.641115
Chrysler Imperial 10.655602 12.504948 440.0 230 2.220716 3.607411
Fiat 128 16.758010 4.965118 78.7 66 2.564069 1.857962
Honda Civic 16.292028 4.965118 75.7 52 2.842040 1.425193
Toyota Corolla 17.080187 4.965118 71.1 65 2.613985 1.592660
Toyota Corona 13.603640 4.965118 120.1 97 2.419493 2.041203
Dodge Challenger 11.052610 12.504948 318.0 150 1.997311 2.699098
AMC Javelin 10.905456 12.504948 304.0 150 2.184508 2.650064
Camaro Z28 9.924367 12.504948 350.0 245 2.431410 2.877896
Pontiac Firebird 12.708661 12.504948 400.0 175 2.152231 2.880619
Fiat X1-9 15.478615 4.965118 79.0 66 2.564069 1.666876
Porsche 914-2 15.101111 4.965118 120.3 91 2.685676 1.815396
Lotus Europa 16.292028 4.965118 95.1 113 2.447161 1.345550
Ford Pantera L 11.197729 12.504948 351.0 264 2.613985 2.492891
Ferrari Dino 12.911428 8.342726 145.0 175 2.387277 2.242811
Maserati Bora 10.806210 12.504948 301.0 335 2.354414 2.727636
Volvo 142E 13.566682 4.965118 121.0 109 2.574912 2.249258
qsec vs am gear carb
Mazda RX4 10.049739 0 1 1.649299 2.5168201
Mazda RX4 Wag 10.235759 0 1 1.649299 2.5168201
Datsun 710 10.728033 1 1 1.649299 0.8836245
Hornet 4 Drive 10.965250 1 0 1.493706 0.8836245
Hornet Sportabout 10.235759 0 0 1.493706 1.5698899
Valiant 11.176666 1 0 1.493706 0.8836245
Duster 360 9.835627 0 0 1.493706 2.5168201
Merc 240D 11.118131 1 0 1.649299 1.5698899
Merc 230 11.825641 1 0 1.649299 1.5698899
Merc 280 10.636056 1 0 1.649299 2.5168201
Merc 280C 10.812393 1 0 1.649299 2.5168201
Merc 450SE 10.358138 0 0 1.493706 2.1028767
Merc 450SL 10.421328 0 0 1.493706 2.1028767
Merc 450SLC 10.545240 0 0 1.493706 2.1028767
Cadillac Fleetwood 10.539122 0 0 1.493706 2.5168201
Lincoln Continental 10.489883 0 0 1.493706 2.5168201
Chrysler Imperial 10.364494 0 0 1.493706 2.5168201
Fiat 128 10.973584 1 1 1.649299 0.8836245
Honda Civic 10.701523 1 1 1.649299 1.5698899
Toyota Corolla 11.091243 1 1 1.649299 0.8836245
Toyota Corona 11.120810 1 0 1.493706 0.8836245
Dodge Challenger 10.186603 0 0 1.493706 1.5698899
AMC Javelin 10.326229 0 0 1.493706 1.5698899
Camaro Z28 9.681913 0 0 1.493706 2.5168201
Pontiac Firebird 10.245533 0 0 1.493706 1.5698899
Fiat X1-9 10.812393 1 1 1.649299 0.8836245
Porsche 914-2 10.130302 0 1 1.740427 1.5698899
Lotus Europa 10.196473 1 1 1.740427 1.5698899
Ford Pantera L 9.341901 0 1 1.740427 2.5168201
Ferrari Dino 9.714446 0 1 1.740427 3.0879918
Maserati Bora 9.380269 0 1 1.740427 3.4325127
Volvo 142E 10.725095 1 1 1.649299 1.5698899
В поле method, можно вставить следующие функции: “knnImpute”, “bagImpute”,“medianImpute”
Knn - к-ближайшие соседи
bagImpute - честно, хз че это, но подразумеваю, что строятся деревья
medianImpute - медиана импуттинг
По трансформации и препроцессингу данных см.
Модельки и Grid search
Каретка, классная штука, но если руки оттуда, в противном случае каретка может превратиться в тыкву, ну или боль тыквы (рус. “тыква болит” - головная боль).
Дабы не разбираться со всеми методами, там их до кхм, как бы по цензурнее выразиться, охре…, кхм, очень много: Модели для каретки
Запишем синтаксис для пройденных Случайный Лес или Лес случайностей, оба названия попахивают употреблением чего-то, например, кексики от Сюзанны для помощи в Фучур сейлз предикт, шучу, простите Сюзанна.
data(mtcars)
mtcars$target <- mtcars$qsec
index <- createDataPartition(mtcars$target,p=0.7,list=F)
train <- mtcars[index,]
test <- mtcars[-index,]
hist(mtcars$target)
$label
[1] "Random Forest"
$library
[1] "randomForest"
$loop
NULL
$type
[1] "Classification" "Regression"
$parameters
parameter class label
1 mtry numeric #Randomly Selected Predictors
$grid
function (x, y, len = NULL, search = "grid")
{
if (search == "grid") {
out <- data.frame(mtry = caret::var_seq(p = ncol(x),
classification = is.factor(y), len = len))
}
else {
out <- data.frame(mtry = unique(sample(1:ncol(x), size = len,
replace = TRUE)))
}
out
}
$fit
function (x, y, wts, param, lev, last, classProbs, ...)
randomForest::randomForest(x, y, mtry = param$mtry, ...)
<bytecode: 0x7f83bff2d308>
$predict
function (modelFit, newdata, submodels = NULL)
if (!is.null(newdata)) predict(modelFit, newdata) else predict(modelFit)
<bytecode: 0x7f83c58a7388>
$prob
function (modelFit, newdata, submodels = NULL)
if (!is.null(newdata)) predict(modelFit, newdata, type = "prob") else predict(modelFit,
type = "prob")
$predictors
function (x, ...)
{
varIndex <- as.numeric(names(table(x$forest$bestvar)))
varIndex <- varIndex[varIndex > 0]
varsUsed <- names(x$forest$ncat)[varIndex]
varsUsed
}
$varImp
function (object, ...)
{
varImp <- randomForest::importance(object, ...)
if (object$type == "regression")
varImp <- data.frame(Overall = varImp[, "%IncMSE"])
else {
retainNames <- levels(object$y)
if (all(retainNames %in% colnames(varImp))) {
varImp <- varImp[, retainNames]
}
else {
varImp <- data.frame(Overall = varImp[, 1])
}
}
out <- as.data.frame(varImp)
if (dim(out)[2] == 2) {
tmp <- apply(out, 1, mean)
out[, 1] <- out[, 2] <- tmp
}
out
}
$levels
function (x)
x$classes
$tags
[1] "Random Forest" "Ensemble Model"
[3] "Bagging" "Implicit Feature Selection"
$sort
function (x)
x[order(x[, 1]), ]
$oob
function (x)
{
out <- switch(x$type, regression = c(sqrt(max(x$mse[length(x$mse)],
0)), x$rsq[length(x$rsq)]), classification = c(1 - x$err.rate[x$ntree,
"OOB"], e1071::classAgreement(x$confusion[, -dim(x$confusion)[2]])[["kappa"]]))
names(out) <- if (x$type == "regression")
c("RMSE", "Rsquared")
else c("Accuracy", "Kappa")
out
}
[1] 1.184866
Забубенил случайно, случайный лес. Хм, случайно наткнулся, можно и нейросеть забабахать, в мозгу у себя пару точно, а потом здесь, ща попробую:
data(mtcars)
mtcars$target <- mtcars$qsec
index <- createDataPartition(mtcars$target,p=0.7,list=F)
train <- mtcars[index,]
test <- mtcars[-index,]
hist(mtcars$target)
fit2 <- train(target~.,train,method = "avNNet", verbose = F)
prediction2 <- predict(fit2,test)
plot(fit2)
RMSE(prediction2,test$target)
#Теперь отскэйлим данные
data(mtcars)
lab <- mtcars$qsec
azino777 <- preProcess(mtcars, method = c("scale","center"))
mtcars <- predict(azino777,mtcars)
mtcars$target <- lab
mtcars
index <- createDataPartition(mtcars$target,p=0.7,list=F)
train <- mtcars[index,]
test <- mtcars[-index,]
fit2 <- train(target~.,train,method = "avNNet")
prediction2 <- predict(fit2,test)
plot(fit2)
RMSE(prediction2,test$target)
Ага, хе.. там, простите, не получилось, но, стоит задуматься
Моделька, примера ради.
Еще один плюс каретки, вместо использования готовых алгоритмов моделей, можете забубенить свой.
Пошли дальше, GridSearch
В Каретке для большинства функций тюнинга, контроля и кросс-валидации используется функция trainControl.
Давайте так, разберусь с функцией trainControl и напишу еще один маркдаун. Так как это очень объемная фукнция, пока дам ссыль выше.
Caret Cross-Validaция
Всем дарова! Как и обещал пишу про кросс-валидацию каретки.
caret поддерживает различные типы кросс-валидации тип cv, а также количество скрещиваний cv можно указать с помощью функции trainControl (), которая передается аргументу trControl в train ():
Важно отметить, что метод моделирования передается функции main train () и метод кросс-валидации функции trainControl (). Рассмотрим на примерах, дабы было коротко и понятно:
+ Fold01: intercept=TRUE
- Fold01: intercept=TRUE
+ Fold02: intercept=TRUE
- Fold02: intercept=TRUE
+ Fold03: intercept=TRUE
- Fold03: intercept=TRUE
+ Fold04: intercept=TRUE
- Fold04: intercept=TRUE
+ Fold05: intercept=TRUE
- Fold05: intercept=TRUE
+ Fold06: intercept=TRUE
- Fold06: intercept=TRUE
+ Fold07: intercept=TRUE
- Fold07: intercept=TRUE
+ Fold08: intercept=TRUE
- Fold08: intercept=TRUE
+ Fold09: intercept=TRUE
- Fold09: intercept=TRUE
+ Fold10: intercept=TRUE
- Fold10: intercept=TRUE
Aggregating results
Fitting final model on full training set
То бишь, внутри данной модели уже есть кросс-валидация (trControl = trainControl(method = “cv”…))
Повторная кросс-валидация обеспечивает лучшую оценку ошибки тестового набора. Более того, вся циклическая процедура может быть повторена. Это занимает больше времени, но дает гораздо больше наборов данных вне выборки для проверки и, следовательно, позволяет более точно оценивать производительность модели. Одна из потрясающих особенностей функции train () в каретке заключается в том, насколько легко запускать очень разные модели или методы перекрестной проверки, просто подбирая несколько простых аргументов для вызова функции. Например, вы можете повторить всю процедуру перекрестной проверки (аеее… кросс-валидации) 5 раз для большей уверенности в своих оценках точности вне образца, например:
+ Fold01: intercept=TRUE
- Fold01: intercept=TRUE
+ Fold02: intercept=TRUE
- Fold02: intercept=TRUE
+ Fold03: intercept=TRUE
- Fold03: intercept=TRUE
+ Fold04: intercept=TRUE
- Fold04: intercept=TRUE
+ Fold05: intercept=TRUE
- Fold05: intercept=TRUE
+ Fold06: intercept=TRUE
- Fold06: intercept=TRUE
+ Fold07: intercept=TRUE
- Fold07: intercept=TRUE
+ Fold08: intercept=TRUE
- Fold08: intercept=TRUE
+ Fold09: intercept=TRUE
- Fold09: intercept=TRUE
+ Fold10: intercept=TRUE
- Fold10: intercept=TRUE
Aggregating results
Fitting final model on full training set
Linear Regression
53940 samples
9 predictor
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 48545, 48546, 48546, 48546, 48547, 48547, ...
Resampling results:
RMSE Rsquared MAE
1130.701 0.919712 740.4856
Tuning parameter 'intercept' was held constant at a value of TRUE
Давайте сравним оценку точности модели с использованием «lm» в наборе данных «Boston», да да на Керасе, который не ставится на мой рабочий комп, козел. Доверюсь транслейту: Сначала мы сделаем 5-кратное перекрестное подтверждение и повторим всю процедуру, но на этот раз мы проведем пять раундов 5-кратной перекрестной проверки:
Linear Regression
506 samples
13 predictor
No pre-processing
Resampling: Cross-Validated (5 fold)
Summary of sample sizes: 406, 404, 404, 404, 406
Resampling results:
RMSE Rsquared MAE
4.860605 0.7279709 3.404925
Tuning parameter 'intercept' was held constant at a value of TRUE
Настройка AUC для валидации модели, вместо accuracy
Функция trainControl () в каретке может быть настроена для использования AUC (вместо АСС), чтобы настроить параметры обученных моделей. Функция удобства TwoClassSummary () позволяет легко сделать это. ВАЖНОЕ ПРИМЕЧАНИЕ: При использовании TwoClassSummary () обязательно включайте аргумент classProbs = TRUE, иначе ваша модель выдает ошибку!
'data.frame': 208 obs. of 61 variables:
$ V1 : num 0.02 0.0453 0.0262 0.01 0.0762 0.0286 0.0317 0.0519 0.0223 0.0164 ...
$ V2 : num 0.0371 0.0523 0.0582 0.0171 0.0666 0.0453 0.0956 0.0548 0.0375 0.0173 ...
$ V3 : num 0.0428 0.0843 0.1099 0.0623 0.0481 ...
$ V4 : num 0.0207 0.0689 0.1083 0.0205 0.0394 ...
$ V5 : num 0.0954 0.1183 0.0974 0.0205 0.059 ...
$ V6 : num 0.0986 0.2583 0.228 0.0368 0.0649 ...
$ V7 : num 0.154 0.216 0.243 0.11 0.121 ...
$ V8 : num 0.16 0.348 0.377 0.128 0.247 ...
$ V9 : num 0.3109 0.3337 0.5598 0.0598 0.3564 ...
$ V10 : num 0.211 0.287 0.619 0.126 0.446 ...
$ V11 : num 0.1609 0.4918 0.6333 0.0881 0.4152 ...
$ V12 : num 0.158 0.655 0.706 0.199 0.395 ...
$ V13 : num 0.2238 0.6919 0.5544 0.0184 0.4256 ...
$ V14 : num 0.0645 0.7797 0.532 0.2261 0.4135 ...
$ V15 : num 0.066 0.746 0.648 0.173 0.453 ...
$ V16 : num 0.227 0.944 0.693 0.213 0.533 ...
$ V17 : num 0.31 1 0.6759 0.0693 0.7306 ...
$ V18 : num 0.3 0.887 0.755 0.228 0.619 ...
$ V19 : num 0.508 0.802 0.893 0.406 0.203 ...
$ V20 : num 0.48 0.782 0.862 0.397 0.464 ...
$ V21 : num 0.578 0.521 0.797 0.274 0.415 ...
$ V22 : num 0.507 0.405 0.674 0.369 0.429 ...
$ V23 : num 0.433 0.396 0.429 0.556 0.573 ...
$ V24 : num 0.555 0.391 0.365 0.485 0.54 ...
$ V25 : num 0.671 0.325 0.533 0.314 0.316 ...
$ V26 : num 0.641 0.32 0.241 0.533 0.229 ...
$ V27 : num 0.71 0.327 0.507 0.526 0.7 ...
$ V28 : num 0.808 0.277 0.853 0.252 1 ...
$ V29 : num 0.679 0.442 0.604 0.209 0.726 ...
$ V30 : num 0.386 0.203 0.851 0.356 0.472 ...
$ V31 : num 0.131 0.379 0.851 0.626 0.51 ...
$ V32 : num 0.26 0.295 0.504 0.734 0.546 ...
$ V33 : num 0.512 0.198 0.186 0.612 0.288 ...
$ V34 : num 0.7547 0.2341 0.2709 0.3497 0.0981 ...
$ V35 : num 0.854 0.131 0.423 0.395 0.195 ...
$ V36 : num 0.851 0.418 0.304 0.301 0.418 ...
$ V37 : num 0.669 0.384 0.612 0.541 0.46 ...
$ V38 : num 0.61 0.106 0.676 0.881 0.322 ...
$ V39 : num 0.494 0.184 0.537 0.986 0.283 ...
$ V40 : num 0.274 0.197 0.472 0.917 0.243 ...
$ V41 : num 0.051 0.167 0.465 0.612 0.198 ...
$ V42 : num 0.2834 0.0583 0.2587 0.5006 0.2444 ...
$ V43 : num 0.282 0.14 0.213 0.321 0.185 ...
$ V44 : num 0.4256 0.1628 0.2222 0.3202 0.0841 ...
$ V45 : num 0.2641 0.0621 0.2111 0.4295 0.0692 ...
$ V46 : num 0.1386 0.0203 0.0176 0.3654 0.0528 ...
$ V47 : num 0.1051 0.053 0.1348 0.2655 0.0357 ...
$ V48 : num 0.1343 0.0742 0.0744 0.1576 0.0085 ...
$ V49 : num 0.0383 0.0409 0.013 0.0681 0.023 0.0264 0.0507 0.0285 0.0777 0.0092 ...
$ V50 : num 0.0324 0.0061 0.0106 0.0294 0.0046 0.0081 0.0159 0.0178 0.0439 0.0198 ...
$ V51 : num 0.0232 0.0125 0.0033 0.0241 0.0156 0.0104 0.0195 0.0052 0.0061 0.0118 ...
$ V52 : num 0.0027 0.0084 0.0232 0.0121 0.0031 0.0045 0.0201 0.0081 0.0145 0.009 ...
$ V53 : num 0.0065 0.0089 0.0166 0.0036 0.0054 0.0014 0.0248 0.012 0.0128 0.0223 ...
$ V54 : num 0.0159 0.0048 0.0095 0.015 0.0105 0.0038 0.0131 0.0045 0.0145 0.0179 ...
$ V55 : num 0.0072 0.0094 0.018 0.0085 0.011 0.0013 0.007 0.0121 0.0058 0.0084 ...
$ V56 : num 0.0167 0.0191 0.0244 0.0073 0.0015 0.0089 0.0138 0.0097 0.0049 0.0068 ...
$ V57 : num 0.018 0.014 0.0316 0.005 0.0072 0.0057 0.0092 0.0085 0.0065 0.0032 ...
$ V58 : num 0.0084 0.0049 0.0164 0.0044 0.0048 0.0027 0.0143 0.0047 0.0093 0.0035 ...
$ V59 : num 0.009 0.0052 0.0095 0.004 0.0107 0.0051 0.0036 0.0048 0.0059 0.0056 ...
$ V60 : num 0.0032 0.0044 0.0078 0.0117 0.0094 0.0062 0.0103 0.0053 0.0022 0.004 ...
$ Class: Factor w/ 2 levels "M","R": 2 2 2 2 2 2 2 2 2 2 ...
Generalized Linear Model
208 samples
60 predictor
2 classes: 'M', 'R'
No pre-processing
Resampling: Cross-Validated (5 fold, repeated 5 times)
Summary of sample sizes: 167, 167, 166, 167, 165, 166, ...
Resampling results:
ROC Sens Spec
0.7360516 0.7403162 0.6823158
Замутим кась, треньку и тест и модельку с Ауком Роком:
prediction_p <- predict(model_1, test, type = "prob")
colAUC(prediction_p, test$Class, plotROC = TRUE)
M R
M vs. R 0.7142111 0.7142111
prediction_c <- predict(model_1, test)
confusionMatrix(prediction_c, test$Class)
Confusion Matrix and Statistics
Reference
Prediction M R
M 24 11
R 9 18
Accuracy : 0.6774
95% CI : (0.5466, 0.7906)
No Information Rate : 0.5323
P-Value [Acc > NIR] : 0.01444
Kappa : 0.3494
Mcnemar's Test P-Value : 0.82306
Sensitivity : 0.7273
Specificity : 0.6207
Pos Pred Value : 0.6857
Neg Pred Value : 0.6667
Prevalence : 0.5323
Detection Rate : 0.3871
Detection Prevalence : 0.5645
Balanced Accuracy : 0.6740
'Positive' Class : M
Ну в целом, таки все, что нарыл. Простите, если не полный список. Ну вот, как говорит Сенсей, Гугл в помощь!
Манипуляция данными с помощью reshape2
reshape2 представляет собой пакет R, написанный Хэдли Викхэмом, который упрощает преобразование данных между широкими и длинными форматами.
В широкоформатных данных каждый столбец представляет отдельную переменную. Например, набор данных mtcars может быть представлен в широком формате как:
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
В данных с длинным форматом один столбец содержит все возможные переменные, а другой столбец содержит их соответствующие значения. Вышеуказанные данные могут быть представлены в длинном формате как:
# variable value
# 1 mpg 21.0
# 2 mpg 21.0
# 3 mpg 22.8
# 4 mpg 21.4
# 5 mpg 18.7
# 6 mpg 18.1
# ...
# variable value
# 347 carb 2
# 348 carb 2
# 349 carb 4
# 350 carb 6
# 351 carb 8
# 352 carb 2
Данные с длинным форматом могут иметь более двух столбцов.
В то время как широкоформатные данные более читабельны, длинный формат легче анализировать. Поэтому полезно знать, как конвертировать между ними.
Вот две основные функции в reshape2:
•melt – конвертировать широкоформатные данные в длинный формат
•cast – преобразование данных из длинного формата в широкоформатный
Перед началом работы с данной библиотекой обратимся к ней, чтобы иметь возможность пользоваться функциями:
melt
Преобразуем встроенные данные mtcars: data table {data-navmenu=“R_Libraries” data-icon=“fa-list”}
car variable value
1 Mazda RX4 mpg 21.0
2 Mazda RX4 Wag mpg 21.0
3 Datsun 710 mpg 22.8
4 Hornet 4 Drive mpg 21.4
5 Hornet Sportabout mpg 18.7
6 Valiant mpg 18.1
Если мы хотим классифицировать все автомобили по количеству cyl и gear, мы можем сделать следующее:
cyl gear carVariable carValue
1 6 4 mpg 21
2 6 4 mpg 21
3 4 4 mpg 22.8
4 6 3 mpg 21.4
5 8 3 mpg 18.7
6 6 3 mpg 18.1
cyl gear carVariable carValue
347 4 5 car Porsche 914-2
348 4 5 car Lotus Europa
349 8 5 car Ford Pantera L
350 6 5 car Ferrari Dino
351 8 5 car Maserati Bora
352 4 4 car Volvo 142E
Как правило, рекомендуется использовать комбинацию переменных, которые могут однозначно идентифицировать каждую точку данных как идентификационные переменные. Следовательно, неплохо использовать cyl и gear, так как есть несколько данных, которые имеют одинаковые значения. Это приведет к проблемам при попытке преобразования данных в первоначальный вид.
cast
Функция cast используется для преобразования данных с длинного формата в широкоформатный. Существует два основных типа функции трансляции:
• dcast - возвращает датафрейм
• acast - возвращает вектор / матрицу / массив
Поскольку объекты dataframe являются наиболее распространенными, разберем как использовать dcast. Мы можем преобразовать данные обратно в широкий формат из длинного формата следующим образом:
car cyl mpg disp hp drat wt qsec vs am gear carb
1 AMC Javelin 8 15.2 304 150 3.15 3.435 17.30 0 0 3 2
2 Cadillac Fleetwood 8 10.4 472 205 2.93 5.250 17.98 0 0 3 4
3 Camaro Z28 8 13.3 350 245 3.73 3.840 15.41 0 0 3 4
4 Chrysler Imperial 8 14.7 440 230 3.23 5.345 17.42 0 0 3 4
5 Datsun 710 4 22.8 108 93 3.85 2.320 18.61 1 1 4 1
6 Dodge Challenger 8 15.5 318 150 2.76 3.520 16.87 0 0 3 2
В данном примере идентификационными переменными были rownames(mtcars) и cyl.
Давайте посмотрим, что произойдет, если бы мы использовали cyl и gear в качестве идентификационных переменных.
cyl gear mpg disp hp drat wt qsec vs am carb car
1 4 3 1 1 1 1 1 1 1 1 1 1
2 4 4 8 8 8 8 8 8 8 8 8 8
3 4 5 2 2 2 2 2 2 2 2 2 2
4 6 3 2 2 2 2 2 2 2 2 2 2
5 6 4 4 4 4 4 4 4 4 4 4 4
6 6 5 1 1 1 1 1 1 1 1 1 1
Мы получаем предупреждение, в котором говорится: отсутствует функция агрегирования: по умолчанию длина. Набор данных просто показывает общее количество наблюдений для каждой комбинации cyl и gear. Это связано с тем, что функция dcast не может однозначно идентифицировать каждую точку данных.
Мы можем найти среднее значение всех переменных для каждой комбинации cyl и gear, используя параметр fun.aggregate следующим образом:
cyl gear mpg disp hp drat wt qsec vs am carb
1 4 3 21.500 120.100 97.0 3.70 2.465000 20.0100 1.0 0.00 1.0
2 4 4 26.925 102.625 76.0 4.11 2.378125 19.6125 1.0 0.75 1.5
3 4 5 28.200 107.700 102.0 4.10 1.826500 16.8000 0.5 1.00 2.0
4 6 3 19.750 241.500 107.5 2.92 3.337500 19.8300 1.0 0.00 1.0
5 6 4 19.750 163.800 116.5 3.91 3.093750 17.6700 0.5 0.50 4.0
6 6 5 19.700 145.000 175.0 3.62 2.770000 15.5000 0.0 1.00 6.0
Здесь мы удалили столбец car, потому что нам не нужны никакие нечисловые значения в столбце значений mtcarsMelt, иначе это вызовет ошибки при попытке вычислить среднее значение.
Пакет Data.table в R
Загрузка данных для иллюстрации
library(data.table)
library(magrittr)
library(Lahman)
Teams = as.data.table(Teams)
Teams yearID lgID teamID franchID divID Rank G Ghome W L DivWin WCWin
1: 1871 NA BS1 BNA NA 3 31 NA 20 10 NA NA
2: 1871 NA CH1 CNA NA 2 28 NA 19 9 NA NA
3: 1871 NA CL1 CFC NA 8 29 NA 10 19 NA NA
4: 1871 NA FW1 KEK NA 7 19 NA 7 12 NA NA
5: 1871 NA NY2 NNA NA 5 33 NA 16 17 NA NA
---
2831: 2016 NL SLN STL C 2 162 81 86 76 N N
2832: 2016 AL TBA TBD E 5 162 81 68 94 N N
2833: 2016 AL TEX TEX W 1 162 81 95 67 Y N
2834: 2016 AL TOR TOR E 2 162 81 89 73 N Y
2835: 2016 NL WAS WSN E 1 162 81 95 67 Y N
LgWin WSWin R AB H X2B X3B HR BB SO SB CS HBP SF RA ER
1: N NA 401 1372 426 70 37 3 60 19 73 NA NA NA 303 109
2: N NA 302 1196 323 52 21 10 60 22 69 NA NA NA 241 77
3: N NA 249 1186 328 35 40 7 26 25 18 NA NA NA 341 116
4: N NA 137 746 178 19 8 2 33 9 16 NA NA NA 243 97
5: N NA 302 1404 403 43 21 1 33 15 46 NA NA NA 313 121
---
2831: N N 779 5548 1415 299 32 225 526 1318 35 26 70 41 712 656
2832: N N 672 5481 1333 288 32 216 449 1482 60 37 69 28 713 665
2833: N N 765 5525 1446 257 23 215 436 1220 99 36 70 40 757 700
2834: N N 759 5479 1358 276 18 221 632 1362 54 24 55 40 666 613
2835: N N 763 5490 1403 268 29 203 536 1252 121 39 64 63 612 570
ERA CG SHO SV IPouts HA HRA BBA SOA E DP FP
1: 3.55 22 1 3 828 367 2 42 23 225 NA 0.838
2: 2.76 25 0 1 753 308 6 28 22 218 NA 0.829
3: 4.11 23 0 0 762 346 13 53 34 223 NA 0.814
4: 5.17 19 1 0 507 261 5 21 17 163 NA 0.803
5: 3.72 32 1 0 879 373 7 42 22 227 NA 0.839
---
2831: 4.08 2 10 38 4345 1432 159 475 1290 107 169 0.983
2832: 4.20 1 8 42 4279 1395 210 491 1357 94 129 0.984
2833: 4.37 1 6 56 4329 1441 201 534 1154 97 190 0.984
2834: 3.78 0 10 43 4378 1340 183 461 1314 88 144 0.986
2835: 3.51 1 12 46 4379 1272 155 468 1476 73 142 0.988
name park attendance BPF
1: Boston Red Stockings South End Grounds I NA 103
2: Chicago White Stockings Union Base-Ball Grounds NA 104
3: Cleveland Forest Citys National Association Grounds NA 96
4: Fort Wayne Kekiongas Hamilton Field NA 101
5: New York Mutuals Union Grounds (Brooklyn) NA 90
---
2831: St. Louis Cardinals Busch Stadium III 3444490 100
2832: Tampa Bay Rays Tropicana Field 1286163 93
2833: Texas Rangers Rangers Ballpark in Arlington 2710402 106
2834: Toronto Blue Jays Rogers Centre 3392099 111
2835: Washington Nationals Nationals Park 2481938 100
PPF teamIDBR teamIDlahman45 teamIDretro
1: 98 BOS BS1 BS1
2: 102 CHI CH1 CH1
3: 100 CLE CL1 CL1
4: 107 KEK FW1 FW1
5: 88 NYU NY2 NY2
---
2831: 99 STL SLN SLN
2832: 94 TBR TBA TBA
2833: 105 TEX TEX TEX
2834: 110 TOR TOR TOR
2835: 98 WSN MON WAS
создание подмножества для краткости
Pitching = as.data.table(Pitching)
Pitching = Pitching[ , .(playerID, yearID, teamID, W, L, G, ERA)]
Pitching playerID yearID teamID W L G ERA
1: bechtge01 1871 PH1 1 2 3 7.96
2: brainas01 1871 WS3 12 15 30 4.50
3: fergubo01 1871 NY2 0 0 1 27.00
4: fishech01 1871 RC1 4 16 24 4.35
5: fleetfr01 1871 NY2 0 1 1 10.00
---
44959: zastrro01 2016 CHN 1 0 8 1.13
44960: zieglbr01 2016 ARI 2 3 36 2.82
44961: zieglbr01 2016 BOS 2 4 33 1.52
44962: zimmejo02 2016 DET 9 7 19 4.87
44963: zychto01 2016 SEA 1 0 12 3.29
используется для определения множества команд из исторических данных и подтверждается что они хранятся как character
fkt = c('teamIDBR', 'teamIDlahman45', 'teamIDretro')
Teams[ , sapply(.SD, is.character), .SDcols = fkt] teamIDBR teamIDlahman45 teamIDretro
TRUE TRUE TRUE
иллюстрация конвертации данных в символ и обратно в таблицу данных
setDF(Teams)
sapply(Teams[ , fkt], is.character) teamIDBR teamIDlahman45 teamIDretro
TRUE TRUE TRUE
setDT(Teams)sapply/lapply применяет FUN к каждому столбцу и возвращает результат как обычно sapply/lapply (здесь FUN == is.character возвращает logical длины 1, поэтому sapply возвращает вектор)
Синтаксис для преобразования этих столбцов в factor очень похож: просто добавьте оператор присваивания :=
Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]Применение.SDcols (и :=) для принятия вектора character или вектора integer позиций столбцов также может быть полезна для преобразования имен столбцов * на основе шаблонов *. Мы могли бы преобразовать все столбцы factor в character и затем преобразуйте все столбцы, содержащие team обратно в factor
Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]
fkt_idx = which(sapply(Teams, is.factor))
Teams[ , (fkt_idx) := lapply(.SD, as.character), .SDcols = fkt_idx]
team_idx = grep('team', names(Teams), value = TRUE)
Teams[ , (team_idx) := lapply(.SD, factor), .SDcols = team_idx]Групповое подмножество: .SD сам является data.table, а .N относится к общему количеству строк в группе (он равен nrow(.SD) внутри каждой группы), поэтому .SD[.N] возвращает всю .SD для последней строки, связанной с каждым teamID
Teams[ , .SD[.N], by = teamID] teamID yearID lgID franchID divID Rank G Ghome W L DivWin WCWin
1: BS1 1875 NA BNA NA 1 82 NA 71 8 NA NA
2: CH1 1871 NA CNA NA 2 28 NA 19 9 NA NA
3: CL1 1872 NA CFC NA 7 22 NA 6 16 NA NA
4: FW1 1871 NA KEK NA 7 19 NA 7 12 NA NA
5: NY2 1875 NA NNA NA 6 71 NA 30 38 NA NA
---
145: ANA 2004 AL ANA W 1 162 81 92 70 Y N
146: ARI 2016 NL ARI W 4 162 81 69 93 N N
147: MIL 2016 NL MIL C 4 162 81 73 89 N N
148: TBA 2016 AL TBD E 5 162 81 68 94 N N
149: MIA 2016 NL FLA E 3 161 80 79 82 N N
LgWin WSWin R AB H X2B X3B HR BB SO SB CS HBP SF RA ER
1: Y NA 831 3516 1124 157 54 14 31 0 NA NA NA NA 343 138
2: N NA 302 1196 323 52 21 10 60 22 69 NA NA NA 241 77
3: N NA 174 935 272 37 6 0 17 13 12 3 NA NA 254 101
4: N NA 137 746 178 19 8 2 33 9 16 NA NA NA 243 97
5: N NA 328 2683 626 84 24 7 21 0 NA NA NA NA 425 170
---
145: N N 836 5675 1603 272 37 162 450 942 143 46 73 41 734 692
146: N N 752 5665 1479 285 56 190 463 1427 137 31 50 38 890 821
147: N N 671 5330 1299 249 19 194 599 1543 181 56 37 39 733 650
148: N N 672 5481 1333 288 32 216 449 1482 60 37 69 28 713 665
149: N N 655 5547 1460 259 42 128 447 1213 71 28 54 38 682 646
ERA CG SHO SV IPouts HA HRA BBA SOA E DP FP
1: 1.70 60 10 17 2196 751 2 29 0 464 NA 0.868
2: 2.76 25 0 1 753 308 6 28 22 218 NA 0.829
3: 4.57 15 0 0 597 289 6 24 0 168 NA 0.823
4: 5.17 19 1 0 507 261 5 21 17 163 NA 0.803
5: 2.40 70 2 0 1911 716 3 24 0 526 NA 0.838
---
145: 4.28 2 11 50 4363 1476 170 502 1164 90 126 0.985
146: 5.09 2 7 31 4354 1563 202 603 1318 101 143 0.983
147: 4.08 0 7 46 4303 1450 178 532 1175 136 145 0.978
148: 4.20 1 8 42 4279 1395 210 491 1357 94 129 0.984
149: 4.05 0 12 55 4305 1358 152 595 1379 86 137 0.985
name park attendance BPF
1: Boston Red Stockings South End Grounds I NA 103
2: Chicago White Stockings Union Base-Ball Grounds NA 104
3: Cleveland Forest Citys National Association Grounds NA 96
4: Fort Wayne Kekiongas Hamilton Field NA 101
5: New York Mutuals Union Grounds (Brooklyn) NA 99
---
145: Anaheim Angels Angels Stadium of Anaheim 3375677 97
146: Arizona Diamondbacks Chase Field 2036216 107
147: Milwaukee Brewers Miller Park 2314614 99
148: Tampa Bay Rays Tropicana Field 1286163 93
149: Miami Marlins Marlins Park 1712417 93
PPF teamIDBR teamIDlahman45 teamIDretro
1: 96 BOS BS1 BS1
2: 102 CHI CH1 CH1
3: 100 CLE CL1 CL1
4: 107 KEK FW1 FW1
5: 100 NYU NY2 NY2
---
145: 97 ANA ANA ANA
146: 108 ARI ARI ARI
147: 99 MIL ML4 MIL
148: 94 TBR TBA TBA
149: 93 MIA FLO MIA
Группа Optima: Вместо того, чтобы фиксировать элемент из каждого под data.table, мы теперь динамически определяем искомый индекс следующим образом:
Teams[ , .SD[which.max(R)], by = teamID] teamID yearID lgID franchID divID Rank G Ghome W L DivWin WCWin
1: BS1 1875 NA BNA NA 1 82 NA 71 8 NA NA
2: CH1 1871 NA CNA NA 2 28 NA 19 9 NA NA
3: CL1 1871 NA CFC NA 8 29 NA 10 19 NA NA
4: FW1 1871 NA KEK NA 7 19 NA 7 12 NA NA
5: NY2 1872 NA NNA NA 3 56 NA 34 20 NA NA
---
145: ANA 2000 AL ANA W 3 162 81 82 80 N N
146: ARI 1999 NL ARI W 1 162 81 100 62 Y N
147: MIL 1999 NL MIL C 5 161 80 74 87 N N
148: TBA 2009 AL TBD E 3 162 81 84 78 N N
149: MIA 2016 NL FLA E 3 161 80 79 82 N N
LgWin WSWin R AB H X2B X3B HR BB SO SB CS HBP SF RA ER
1: Y NA 831 3516 1124 157 54 14 31 0 NA NA NA NA 343 138
2: N NA 302 1196 323 52 21 10 60 22 69 NA NA NA 241 77
3: N NA 249 1186 328 35 40 7 26 25 18 NA NA NA 341 116
4: N NA 137 746 178 19 8 2 33 9 16 NA NA NA 243 97
5: N NA 523 2423 668 86 13 4 55 52 56 21 NA NA 362 145
---
145: N N 864 5628 1574 309 34 236 608 1024 93 52 47 43 869 805
146: N N 908 5658 1566 289 46 216 588 1045 137 39 NA NA 676 615
147: N N 815 5582 1524 299 30 165 658 1065 81 33 NA NA 886 812
148: N N 803 5462 1434 297 36 199 642 1229 194 61 49 45 754 686
149: N N 655 5547 1460 259 42 128 447 1213 71 28 54 38 682 646
ERA CG SHO SV IPouts HA HRA BBA SOA E DP FP
1: 1.70 60 10 17 2196 751 2 29 0 464 NA 0.868
2: 2.76 25 0 1 753 308 6 28 22 218 NA 0.829
3: 4.11 23 0 0 762 346 13 53 34 223 NA 0.814
4: 5.17 19 1 0 507 261 5 21 17 163 NA 0.803
5: 2.55 54 3 0 1536 618 2 32 0 326 NA 0.867
---
145: 5.00 5 3 46 4344 1534 228 662 846 134 182 0.978
146: 3.77 16 9 42 4401 1387 176 543 1198 104 129 0.983
147: 5.07 2 5 40 4327 1618 213 616 987 127 142 0.979
148: 4.33 3 5 41 4282 1421 183 515 1125 98 135 0.983
149: 4.05 0 12 55 4305 1358 152 595 1379 86 137 0.985
name park attendance BPF
1: Boston Red Stockings South End Grounds I NA 103
2: Chicago White Stockings Union Base-Ball Grounds NA 104
3: Cleveland Forest Citys National Association Grounds NA 96
4: Fort Wayne Kekiongas Hamilton Field NA 101
5: New York Mutuals Union Grounds (Brooklyn) NA 93
---
145: Anaheim Angels Edison International Field 2066982 102
146: Arizona Diamondbacks Bank One Ballpark 3019654 101
147: Milwaukee Brewers County Stadium 1701796 99
148: Tampa Bay Rays Tropicana Field 1874962 98
149: Miami Marlins Marlins Park 1712417 93
PPF teamIDBR teamIDlahman45 teamIDretro
1: 96 BOS BS1 BS1
2: 102 CHI CH1 CH1
3: 100 CLE CL1 CL1
4: 107 KEK FW1 FW1
5: 92 NYU NY2 NY2
---
145: 103 ANA ANA ANA
146: 101 ARI ARI ARI
147: 99 MIL ML4 MIL
148: 97 TBR TBA TBA
149: 93 MIA FLO MIA
Сгруппированная регрессия: Предположим, что мы ожидаем, что эта зависимость будет отличаться по команде (т.е. для каждой команды будет другой наклон). Мы можем легко повторить эту регрессию, чтобы исследовать гетерогенность в этой зависимости следующим образом (отметив, что стандартные ошибки из этого подхода в целом неверны - спецификация ERA ~ W*teamID
r <- Pitching[ , if (.N > 20) .(w_coef = coef(lm(ERA ~ W))['W']), by = teamID
][ , hist(w_coef, 20, xlab = 'Fitted Coefficient on W',
ylab = 'Number of Teams', col = 'darkgreen',
main = 'Distribution of Team-Level Win Coefficients on ERA')]
(lubridate) предоставляет инструменты, которые облегчают работу с датами при анализе данных. Эти инструменты сгруппированы по решению определенных целей.
1. СИНХРОНИЗАЦИЯ ДАТЫ
ymd("20110604")[1] "2011-06-04"
mdy("06-04-2011")[1] "2011-06-04"
dmy("04/06/2011")[1] "2011-06-04"
arrive <- ymd_hms("2011-06-04 12:00:00", tz = "Pacific/Auckland")
arrive[1] "2011-06-04 12:00:00 NZST"
leave <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")
leave[1] "2011-08-10 14:00:00 NZST"
2. НАСТРОЙКА И ИЗВЛЕЧЕНИЕ ИНФОРМАЦИИ
second(arrive)[1] 0
second(arrive) <- 25
arrive[1] "2011-06-04 12:00:25 NZST"
wday(arrive)[1] 7
3. ЧАСОВЫЕ ПОЯСА - Есть две очень полезные вещи, связанные с датами и часовыми поясами. Первая, мы можем отобразить одно и то же время в других часовых поясах. Вторая, мы можем создайть новое время, объединив существующее время часов с новым часовым поясом. Они выполняются с помощью with_tz() и force_tz().
meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland")
with_tz(meeting, "America/Chicago")[1] "2011-06-30 16:00:00 CDT"
meeting[1] "2011-07-01 09:00:00 NZST"
mistake <- force_tz(meeting, "America/Chicago")
with_tz(mistake, "Pacific/Auckland")[1] "2011-07-02 02:00:00 NZST"
mistake[1] "2011-07-01 09:00:00 CDT"
4. ВРЕМЕННЫЕ ИНТЕРВАЛЫ
auckland <- interval(arrive, leave)
auckland[1] 2011-06-04 12:00:25 NZST--2011-08-10 14:00:00 NZST
or
auckland <- arrive %--% leave
auckland[1] 2011-06-04 12:00:25 NZST--2011-08-10 14:00:00 NZST
jsm <- interval(ymd(20110720, tz = "Pacific/Auckland"), ymd(20110831, tz = "Pacific/Auckland"))
jsm[1] 2011-07-20 NZST--2011-08-31 NZST
int_overlaps(jsm, auckland)[1] TRUE
setdiff(auckland, jsm)[1] 2011-06-04 12:00:25 NZST--2011-07-20 NZST
5. АРИФМЕТИКА С ДАТАМИ
minutes(2)[1] "2M 0S"
dminutes(2) ## duration
dminutes(2)[1] "120s (~2 minutes)"
leap_year(2011) ## regular year
leap_year(2011) ## regular year[1] FALSE
ymd(20110101) + dyears(1)
ymd(20110101) + dyears(1)[1] "2012-01-01"
ymd(20110101) + years(1)[1] "2012-01-01"
leap_year(2012) ## leap year[1] TRUE
ymd(20120101) + dyears(1)[1] "2012-12-31"
ymd(20120101) + years(1)[1] "2013-01-01"
meetings <- meeting + weeks(0:5)
meetings[1] "2011-07-01 09:00:00 NZST" "2011-07-08 09:00:00 NZST"
[3] "2011-07-15 09:00:00 NZST" "2011-07-22 09:00:00 NZST"
[5] "2011-07-29 09:00:00 NZST" "2011-08-05 09:00:00 NZST"
meetings %within% jsm[1] FALSE FALSE FALSE TRUE TRUE TRUE
auckland / ddays(1)[1] 67.08304
auckland / ddays(2)[1] 33.54152
auckland / dminutes(1)[1] 96599.58
auckland %/% months(1)[1] 2
auckland %% months(1)[1] 2011-08-04 12:00:25 NZST--2011-08-10 14:00:00 NZST
as.period(auckland %% months(1))[1] "6d 1H 59M 35S"
as.period(auckland)[1] "2m 6d 1H 59M 35S"
jan31 <- ymd("2013-01-31")
jan31[1] "2013-01-31"
jan31 + months(0:11) [1] "2013-01-31" NA "2013-03-31" NA "2013-05-31"
[6] NA "2013-07-31" "2013-08-31" NA "2013-10-31"
[11] NA "2013-12-31"
floor_date(jan31, "month") + months(0:11) + days(31) [1] "2013-02-01" "2013-03-04" "2013-04-01" "2013-05-02" "2013-06-01"
[6] "2013-07-02" "2013-08-01" "2013-09-01" "2013-10-02" "2013-11-01"
[11] "2013-12-02" "2014-01-01"
jan31 %m+% months(0:11) [1] "2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31"
[6] "2013-06-30" "2013-07-31" "2013-08-31" "2013-09-30" "2013-10-31"
[11] "2013-11-30" "2013-12-31"
Работа с библиотекой dplyr
Библиотека dplyr удобный и мощный инструмент по работе с датасетами, Позволяет заниматься data-engineering намного быстрее, чем в Excel.
Основные функции dplyr:
filter() выбрать по условиюarrange() сортироватьselect() выбрать столбцыslice() вытаскивает заданные колонкиmutate() создать новую колонкуgroup_by() группирует столбец по факторным значениямsummarise() суммирует данные в одну строку значенийsample_n() сделать случайную выборкуДавайте создадим данные для того что бы увидеть разницу между data.frame и data_frame. data_frame это функция dplyr и она в удобной форме выводит данные
my.frame <- data.frame(x = rnorm(10000), y = rnorm(10000), f = factor(rep(1:2,5000)))
my_frame <- data_frame(x = rnorm(10000), y = rnorm(10000), f = factor(rep(1:2,5000)))Попробуем вытащить данные
my_frame # 10 значений выходит в консоли
diamonds <- as_data_frame(diamonds)
diamonds# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.230 Ideal E SI2 61.5 55. 326 3.95 3.98 2.43
2 0.210 Premium E SI1 59.8 61. 326 3.89 3.84 2.31
3 0.230 Good E VS1 56.9 65. 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58. 334 4.20 4.23 2.63
5 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
6 0.240 Very Good J VVS2 62.8 57. 336 3.94 3.96 2.48
7 0.240 Very Good I VVS1 62.3 57. 336 3.95 3.98 2.47
8 0.260 Very Good H SI1 61.9 55. 337 4.07 4.11 2.53
9 0.220 Fair E VS2 65.1 61. 337 3.87 3.78 2.49
10 0.230 Very Good H VS1 59.4 61. 338 4.00 4.05 2.39
# ... with 53,930 more rows
в data_frame можно сразу создать переменную и сразу же использовать её
my_data_2 <- data_frame(x = rnorm(10), y = abs(x))Давайте разберём фнукцию select. Как мы помним ранее select() это выбрать столбцы
select(diamonds, cut, carat) # Выбираем два столбца из датасета diamondsselect(diamonds, cut:table) # от cut до tableselect(diamonds, 1:3) select(diamonds, starts_with("c")) # выбрать те переменные которые начинаются с буквы "с""Дополнительные функций select: select(iris, contains(“.”)) - выбирает столбцы, имя которых начинается со строки символов
Давайте разберём фнукцию slice. Как мы помним ранее slice() это вытаскивать заданные колонки
slice(diamonds,1:10) # вытаскиваем с 1 по 10 колонку
## # A tibble: 10 x 10
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.230 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
## 2 0.210 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
## 3 0.230 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
## 4 0.290 Premium I VS2 62.4 58.0 334 4.20 4.23 2.63
## 5 0.310 Good J SI2 63.3 58.0 335 4.34 4.35 2.75
## 6 0.240 Very Good J VVS2 62.8 57.0 336 3.94 3.96 2.48
## 7 0.240 Very Good I VVS1 62.3 57.0 336 3.95 3.98 2.47
## 8 0.260 Very Good H SI1 61.9 55.0 337 4.07 4.11 2.53
## 9 0.220 Fair E VS2 65.1 61.0 337 3.87 3.78 2.49
## 10 0.230 Very Good H VS1 59.4 61.0 338 4.00 4.05 2.39
filter() это выбрать данные по условию
filter(diamonds, carat > 0.3, color == "J") # фильтруме данные по условию carat и color# A tibble: 2,735 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
2 0.310 Ideal J SI2 62.2 54. 344 4.35 4.37 2.71
3 0.310 Very Good J SI1 59.4 62. 353 4.39 4.43 2.62
4 0.310 Very Good J SI1 58.1 62. 353 4.44 4.47 2.59
5 0.330 Ideal J SI1 61.1 56. 403 4.49 4.55 2.76
6 1.17 Very Good J I1 60.2 61. 2774 6.83 6.90 4.13
7 1.05 Very Good J SI2 63.2 56. 2789 6.49 6.45 4.09
8 1.05 Fair J SI2 65.8 59. 2789 6.41 6.27 4.18
9 1.00 Premium J SI2 62.3 58. 2801 6.45 6.34 3.98
10 0.930 Premium J SI2 61.9 57. 2807 6.21 6.19 3.84
# ... with 2,725 more rows
arrange() это сортировать по убыванию или возрастанию
arrange(diamonds, price, depth) # сортировка по цене и по возможности по depth# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.210 Premium E SI1 59.8 61. 326 3.89 3.84 2.31
2 0.230 Ideal E SI2 61.5 55. 326 3.95 3.98 2.43
3 0.230 Good E VS1 56.9 65. 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58. 334 4.20 4.23 2.63
5 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
6 0.240 Very Good I VVS1 62.3 57. 336 3.95 3.98 2.47
7 0.240 Very Good J VVS2 62.8 57. 336 3.94 3.96 2.48
8 0.260 Very Good H SI1 61.9 55. 337 4.07 4.11 2.53
9 0.220 Fair E VS2 65.1 61. 337 3.87 3.78 2.49
10 0.230 Very Good H VS1 59.4 61. 338 4.00 4.05 2.39
# ... with 53,930 more rows
arrange(diamonds, desc(carat)) # сортировка по убыванию # A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 5.01 Fair J I1 65.5 59. 18018 10.7 10.5 6.98
2 4.50 Fair J I1 65.8 58. 18531 10.2 10.2 6.72
3 4.13 Fair H I1 64.8 61. 17329 10.0 9.85 6.43
4 4.01 Premium I I1 61.0 61. 15223 10.1 10.1 6.17
5 4.01 Premium J I1 62.5 62. 15223 10.0 9.94 6.24
6 4.00 Very Good I I1 63.3 58. 15984 10.0 9.94 6.31
7 3.67 Premium I I1 62.4 56. 16193 9.86 9.81 6.13
8 3.65 Fair H I1 67.1 53. 11668 9.53 9.48 6.38
9 3.51 Premium J VS2 62.5 59. 18701 9.66 9.63 6.03
10 3.50 Ideal H I1 62.8 57. 12587 9.65 9.59 6.03
# ... with 53,930 more rows
rename() меняет название переменных в данных
rename(diamonds, new_cut = cut) # меняет название переменной# A tibble: 53,940 x 10
carat new_cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.230 Ideal E SI2 61.5 55. 326 3.95 3.98 2.43
2 0.210 Premium E SI1 59.8 61. 326 3.89 3.84 2.31
3 0.230 Good E VS1 56.9 65. 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58. 334 4.20 4.23 2.63
5 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
6 0.240 Very Good J VVS2 62.8 57. 336 3.94 3.96 2.48
7 0.240 Very Good I VVS1 62.3 57. 336 3.95 3.98 2.47
8 0.260 Very Good H SI1 61.9 55. 337 4.07 4.11 2.53
9 0.220 Fair E VS2 65.1 61. 337 3.87 3.78 2.49
10 0.230 Very Good H VS1 59.4 61. 338 4.00 4.05 2.39
# ... with 53,930 more rows
mutate() создаёт новую колонку применяя какое нибудь условие
m <- mutate(diamonds, sqrt_price = sqrt(price), log_carat = log(carat))mutate_all() применяют функции ко всем (негрупповым) столбцамmutate_at() позволяют вам выбирать столбцы на основе имени, как в select()mutate_if() работает со столбцами по условию, для которых предикат возвращает TRUEgroup_by() группирует столбец
# group_by() и summarise()
x <- group_by(diamonds, cut)
## если вытащить sample_n и slice то там выйдет по группированным данным
sample_n(x, 2)# A tibble: 10 x 10
# Groups: cut [5]
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.900 Fair I SI1 65.7 58. 2873 6.03 6.00 3.95
2 0.760 Fair D SI2 55.5 69. 2518 6.16 6.07 3.39
3 0.900 Good G VS2 64.9 61. 4124 5.91 5.99 3.86
4 0.900 Good E VS2 64.2 59. 4315 6.02 6.10 3.89
5 0.320 Very Good E VS2 62.0 54. 702 4.37 4.41 2.72
6 1.71 Very Good D SI2 63.5 56. 11844 7.58 7.51 4.79
7 1.01 Premium D SI2 62.6 60. 4338 6.40 6.37 4.00
8 0.300 Premium F IF 61.6 58. 1085 4.34 4.30 2.66
9 0.510 Ideal G VVS2 61.8 56. 1974 5.16 5.10 3.17
10 1.01 Ideal E VS2 61.5 57. 7421 6.48 6.44 3.97
slice(x, 1)
## # A tibble: 5 x 10
## # Groups: cut [5]
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.220 Fair E VS2 65.1 61.0 337 3.87 3.78 2.49
## 2 0.230 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
## 3 0.240 Very Good J VVS2 62.8 57.0 336 3.94 3.96 2.48
## 4 0.210 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
## 5 0.230 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
ungroup() разгрупирует данные
ungroup(diamonds)# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.230 Ideal E SI2 61.5 55. 326 3.95 3.98 2.43
2 0.210 Premium E SI1 59.8 61. 326 3.89 3.84 2.31
3 0.230 Good E VS1 56.9 65. 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58. 334 4.20 4.23 2.63
5 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
6 0.240 Very Good J VVS2 62.8 57. 336 3.94 3.96 2.48
7 0.240 Very Good I VVS1 62.3 57. 336 3.95 3.98 2.47
8 0.260 Very Good H SI1 61.9 55. 337 4.07 4.11 2.53
9 0.220 Fair E VS2 65.1 61. 337 3.87 3.78 2.49
10 0.230 Very Good H VS1 59.4 61. 338 4.00 4.05 2.39
# ... with 53,930 more rows
slice(x, 1)
## # A tibble: 5 x 10
## # Groups: cut [5]
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.220 Fair E VS2 65.1 61.0 337 3.87 3.78 2.49
## 2 0.230 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
## 3 0.240 Very Good J VVS2 62.8 57.0 336 3.94 3.96 2.48
## 4 0.210 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
## 5 0.230 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
ungroup() разгрупирует данные
ungroup(diamonds)# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.230 Ideal E SI2 61.5 55. 326 3.95 3.98 2.43
2 0.210 Premium E SI1 59.8 61. 326 3.89 3.84 2.31
3 0.230 Good E VS1 56.9 65. 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58. 334 4.20 4.23 2.63
5 0.310 Good J SI2 63.3 58. 335 4.34 4.35 2.75
6 0.240 Very Good J VVS2 62.8 57. 336 3.94 3.96 2.48
7 0.240 Very Good I VVS1 62.3 57. 336 3.95 3.98 2.47
8 0.260 Very Good H SI1 61.9 55. 337 4.07 4.11 2.53
9 0.220 Fair E VS2 65.1 61. 337 3.87 3.78 2.49
10 0.230 Very Good H VS1 59.4 61. 338 4.00 4.05 2.39
# ... with 53,930 more rows
summarise_each(iris, funs(mean)) - Применить итоговую функцию к каждому столбцу
Пайпинг крайне полезная функция, помогает каждый раз не писать входные данные в этом коде мы выбрали данные diamonds и передали их select что бы он отобрал 3 переменные: cut, carat и price. Затем группируем их по переменной price и меняем название колонки на “Tsena”
# Ctr+shift+m создаёт %>%(пайпинг)
xc <- diamonds %>% select(cut, carat, price) %>% group_by(price) %>% rename("Tsena" = price)count(iris, Species, wt = Sepal.Length) - показывает какое кол-во уникальных значений
count(diamonds, cut)# дополнение wt = price, делает суммирование по цене
count(diamonds, cut, wt = price)Функции объединения данных
full_join(a, b, by = “x1”) - присоединение данных. Сохранение всех значений и всех строк
bind_cols(y, z) - добавляет z в y как новые столбцы
Дополнительные функций dplyr:
Библиотека purrr
install.packages(“purrr”)
library(purrr)Начну с того, что сложно было найти Чит-щит (щит от англ. sheet, а не shit, то бишь лист и не для shit) на телефоне, но прийдя на работу нашел быстро link. Наверное, извините, Сенсей, если не прав буду, эту библиотеку мы будем применять для объединения функций для вычисления и работы с преобразованием и трансформацией столбцов и строк.
Давайте посмотрим встроенное описание:
?purrr## starting httpd help server ... done
Там только ссылки, ну ок.
Функции map
Функции map, аналогичны стандартным функциям Apply, они применяют функцию (Вашу) итеративно к каждому элементу списка или вектора:
data(mtcars)
map(mtcars, function(x){is.na(x)})$mpg
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$cyl
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$disp
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$hp
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$drat
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$wt
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$qsec
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$vs
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$am
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$gear
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
$carb
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x <- list(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)
map2(x, y, `+`)[[1]]
[1] 2
[[2]]
[1] 12
[[3]]
[1] 103
x <- list(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)
pmap(list(x,y,z), sum)[[1]]
[1] 7
[[2]]
[1] 62
[[3]]
[1] 603
4.Самая “жесткая” функция этой области invoke_map(функция1, функция2, функция3, данные,). Применяет несколько функций:
list(m1 = mean, m2 = median) %>% invoke_map(x = 1:100)$m1
[1] 50.5
$m2
[1] 50.5
#ИЛИ
l <- list(mean,sd)
invoke_map(l,x=1:200)[[1]]
[1] 100.5
[[2]]
[1] 57.87918
#ИЛИ ближе к нашему делу
t <- list(function(x){sum(x)},function(x){mean(x)})
invoke_map(t,x=1:300)[[1]]
[1] 45150
[[2]]
[1] 150.5
Фильтрация
Ща буду торопиться, т.к. не успеваю до урока подготовиться:
obj1 <- list("a", list(1, elt = "Method"))
obj1[[1]]
[1] "a"
[[2]]
[[2]][[1]]
[1] 1
[[2]]$elt
[1] "Method"
obj2 <- list("b", list(2, elt = "NeMethod"))
obj2[[1]]
[1] "b"
[[2]]
[[2]][[1]]
[1] 2
[[2]]$elt
[1] "NeMethod"
x <- list(obj1, obj2)
my_element <- function(x) x[[2]]$elt
pluck(x, 1, my_element)[1] "Method"
pluck(x, 2, my_element)[1] "NeMethod"
rep(10, 10) %>%
map(sample, 5) %>%
keep(function(x) mean(x) > 6)[[1]]
[1] 10 8 4 7 6
[[2]]
[1] 1 8 9 10 4
[[3]]
[1] 1 6 7 10 8
x <- rerun(5, a = rbernoulli(1), b = sample(10))
x[[1]]
[[1]]$a
[1] TRUE
[[1]]$b
[1] 8 9 1 2 10 3 5 6 4 7
[[2]]
[[2]]$a
[1] TRUE
[[2]]$b
[1] 3 2 5 7 4 10 1 8 6 9
[[3]]
[[3]]$a
[1] FALSE
[[3]]$b
[1] 1 5 10 3 8 4 9 2 7 6
[[4]]
[[4]]$a
[1] FALSE
[[4]]$b
[1] 8 4 5 7 6 1 2 3 9 10
[[5]]
[[5]]$a
[1] FALSE
[[5]]$b
[1] 8 5 10 3 1 2 9 7 4 6
x %>% keep("a")[[1]]
[[1]]$a
[1] TRUE
[[1]]$b
[1] 8 9 1 2 10 3 5 6 4 7
[[2]]
[[2]]$a
[1] TRUE
[[2]]$b
[1] 3 2 5 7 4 10 1 8 6 9
x %>% discard("a")[[1]]
[[1]]$a
[1] FALSE
[[1]]$b
[1] 1 5 10 3 8 4 9 2 7 6
[[2]]
[[2]]$a
[1] FALSE
[[2]]$b
[1] 8 4 5 7 6 1 2 3 9 10
[[3]]
[[3]]$a
[1] FALSE
[[3]]$b
[1] 8 5 10 3 1 2 9 7 4 6
compact - удалить NA-элементы (пустые значения), compact(x)
head_while - возвращать элементы, пока не случится условие, к примеру, head_while(x,is.character) - будут возвращаться значения Х, пока они в формате character.
pos <- function(x) x >= 0
head_while(5:-5, pos)[1] 5 4 3 2 1 0
tail_while(5:-5, negate(pos))[1] -1 -2 -3 -4 -5
big <- function(x) x > 100
head_while(0:10, big)integer(0)
tail_while(0:10, big)integer(0)
Суммирование
y <- list(0:10, 5.5)
y %>% every(is.numeric)[1] TRUE
y %>% every(is.integer)[1] FALSE
#ИЛИ
x <- list(0, 1, TRUE)
x %>% every(identity)[1] TRUE
x <- list(0, 1, TRUE)
x %>% some(identity)[1] TRUE
x <- list(1:10, 5, 9.9)
x %>% has_element(1:10)[1] TRUE
x %>% has_element(3)[1] FALSE
detect - типа дно детектед (обнаружен), грубо, детектор какого либо элемента по условию. detect(x, условие)
detect_index - тоже, что и detect, только возвращает индекс элемента
x <- list(
list(1, foo = FALSE),
list(2, foo = TRUE),
list(3, foo = TRUE)
)
detect(x, "foo")[[1]]
[1] 2
$foo
[1] TRUE
detect_index(x, "foo")[1] 2
vec_depth - возвращает информацию о векторе, количество уровней индексов, глубина вектора, по пацански обзывается. vec_depth(x)
x <- list(
list(),
list(list()),
list(list(list(1)))
)
vec_depth(x)[1] 5
x %>% map_int(vec_depth)[1] 1 2 4
Трансформация
#Типа mutate
data("iris")
str(iris)'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
iris %>%
modify_if(is.factor, as.character) %>%
str()'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : chr "setosa" "setosa" "setosa" "setosa" ...
modify_at - применить функцию только к тем значениям, к которым вы хотите, но хотелку надо указать. modify_at(x,че хотите,функция)
modify_if - применить функцию только к тем значениям, которые проходят по условию, которому вы хотите. Насчет хотелки не повторяюсь. modify_if(x,хотелка,функция)
4.modify_depth - применить функцию к определенной глубине вектора, до определенного уровня типа. modify_depth(х, глубина, функция)
Придание новой формы листу (reshape), не, не диета.
x <- rerun(2, sample(4))
x[[1]]
[1] 2 4 3 1
[[2]]
[1] 2 4 3 1
x %>% flatten()[[1]]
[1] 2
[[2]]
[1] 4
[[3]]
[1] 3
[[4]]
[1] 1
[[5]]
[1] 2
[[6]]
[1] 4
[[7]]
[1] 3
[[8]]
[1] 1
x %>% flatten_int()[1] 2 4 3 1 2 4 3 1
x <- rerun(5, x = runif(1), y = runif(5))
x %>% str()List of 5
$ :List of 2
..$ x: num 0.135
..$ y: num [1:5] 0.512 0.909 0.959 0.941 0.251
$ :List of 2
..$ x: num 0.561
..$ y: num [1:5] 0.377 0.064 0.66 0.228 0.42
$ :List of 2
..$ x: num 0.625
..$ y: num [1:5] 0.705 0.339 0.972 0.719 0.285
$ :List of 2
..$ x: num 0.809
..$ y: num [1:5] 0.667 0.532 0.674 0.142 0.908
$ :List of 2
..$ x: num 0.63
..$ y: num [1:5] 0.7622 0.939 0.1776 0.0287 0.6363
x %>% transpose() %>% str()List of 2
$ x:List of 5
..$ : num 0.135
..$ : num 0.561
..$ : num 0.625
..$ : num 0.809
..$ : num 0.63
$ y:List of 5
..$ : num [1:5] 0.512 0.909 0.959 0.941 0.251
..$ : num [1:5] 0.377 0.064 0.66 0.228 0.42
..$ : num [1:5] 0.705 0.339 0.972 0.719 0.285
..$ : num [1:5] 0.667 0.532 0.674 0.142 0.908
..$ : num [1:5] 0.7622 0.939 0.1776 0.0287 0.6363
Присоединение к списку (dplyr - лучше, кажется, хотя здесь чуть иначе)
append(1:5, 0:1, after = 3)[1] 1 2 3 0 1 4 5
prepend(1:5, 0:1, before = 1)[1] 0 1 1 2 3 4 5
inputs <- list(arg1 = "a", arg2 = "b")
splice(inputs, arg3 = c("c1", "c2")) %>% str()List of 3
$ arg1: chr "a"
$ arg2: chr "b"
$ arg3: chr [1:2] "c1" "c2"
list(inputs, arg3 = c("c1", "c2")) %>% str()List of 2
$ :List of 2
..$ arg1: chr "a"
..$ arg2: chr "b"
$ arg3: chr [1:2] "c1" "c2"
c(inputs, arg3 = c("c1", "c2")) %>% str()List of 4
$ arg1 : chr "a"
$ arg2 : chr "b"
$ arg31: chr "c1"
$ arg32: chr "c2"
Работа с Lists (вышеуказанные листы и списки, спасибо гугл транслейт)
array_tree(массив, margin = “…”) - магия, массив переводим в списокx <- array(1:12, c(2, 2, 3))
x, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 11
[2,] 10 12
array_tree(x) %>% str()List of 2
$ :List of 2
..$ :List of 3
.. ..$ : int 1
.. ..$ : int 5
.. ..$ : int 9
..$ :List of 3
.. ..$ : int 3
.. ..$ : int 7
.. ..$ : int 11
$ :List of 2
..$ :List of 3
.. ..$ : int 2
.. ..$ : int 6
.. ..$ : int 10
..$ :List of 3
.. ..$ : int 4
.. ..$ : int 8
.. ..$ : int 12
cross2(x,y) - крутая штука, все комбинации х и у. Есть еще cross3 и cross_dfdata <- list(
id = c("John", "Jane"),
greeting = c("Hello.", "Bonjour."),
sep = c("! ", "... ")
)
data$id
[1] "John" "Jane"
$greeting
[1] "Hello." "Bonjour."
$sep
[1] "! " "... "
args <- data %>% cross_df()
args# A tibble: 8 x 3
sep id sep greeting
sep <chr>sep <chr>
1"! " John "! " Hello.
2"! " Jane "! " Hello.
3"! " John "! " Bonjour.
4"! " Jane "! " Bonjour.
5"! " John "! " Hello.
6"! " Jane "! " Hello.
7"! " John "! " Bonjour.
8"! " Jane "! " Bonjour.
set_names(x,…, имена) - присвоить имена вектору или спискуset_names(1:4, c("a", "b", "c", "d"))a b c d
1 2 3 4
Уменьшение Lists
1)reduce(x,что-либо) - уменьшение списка, рекурсивно, путем применения функции к каждому элементу. Например: reduce(x,sum)
1:3 %>% reduce(`+`)[1] 6
1:10 %>% reduce(`*`)[1] 3628800
1:3 %>% accumulate(`+`)[1] 1 3 6
Модификация функций
compose() - компоновать несколько функцийnot_null <- compose(`!`, is.null)lift() - Изменить тип вводных данных функцийx <- list(x = c(1:100, NA, 1000), na.rm = TRUE, trim = 0.9)
lift_dl(mean)(x)[1] 51
rerun() - Перезапуск выражений на эннное количество раз#Видели 1к раз выше, ну ладно:
10 %>% rerun(rnorm(5))[[1]]
[1] -0.30345142 0.05186067 0.28011235 -1.20547940 0.21458187
[[2]]
[1] 0.48894985 -0.85992519 -0.71198861 0.08085422 -1.58673473
[[3]]
[1] -0.6017978 -0.1479132 -0.5942114 2.0270479 0.7352158
[[4]]
[1] 1.3820602 -0.8773581 1.1302845 0.2946867 -0.5310896
[[5]]
[1] -0.3762470 -0.9146927 -0.3964334 -1.9948261 -0.7681583
[[6]]
[1] 0.7005356 -1.6918596 -1.0060063 -0.8200729 -0.4711455
[[7]]
[1] 0.3680191 -0.9415149 -0.3078407 -1.2385472 -0.5908439
[[8]]
[1] 0.3426692 0.1723188 1.7485898 -0.6325711 -2.4096723
[[9]]
[1] 0.4126421 0.1691946 -0.1652832 -0.5863225 -1.4244580
[[10]]
[1] 0.05700923 0.39522105 -0.43854893 -0.23787137 -0.21427156
negate() - отменить предикатную функциюnegate("x")function (x, ...)
{
!pluck(x, list("x"), .default = NULL)
}
<environment: 0x7f83abb4edf0>
negate(is.null)function (x)
{
!is.null(x = x)
}
<environment: base>
negate(~ .x > 0)function (..., .x = ..1, .y = ..2, . = ..1)
{
!.x > 0
}
partial() - создание версии функции, которая имеет некоторые аргументы для того чтобы их увидить#EASY Варик:
compact1 <- function(x) discard(x, is.null)
#Partial
compact2 <- partial(discard, .p = is.null)safely() - модифицировать функцию, дабы вернуть как результаты, так и ошибкиsafe_log <- safely(log)
safe_log(10)$result
[1] 2.302585
$error
NULL
safe_log("a")$result
NULL
$error
<simpleError in log(x = x, base = base): non-numeric argument to mathematical function>
list("a", 10, 100) %>%
map(safe_log) %>%
transpose()$result
$result[[1]]
NULL
$result[[2]]
[1] 2.302585
$result[[3]]
[1] 4.60517
$error
$error[[1]]
<simpleError in log(x = x, base = base): non-numeric argument to mathematical function>
$error[[2]]
NULL
$error[[3]]
NULL
quietly() - safely + warnings и messages и outputs
possibly() - возвращает значение по умолчанию, когда происходит ошибка
Nested Data - вложенные данные
Ваще здесь жесткач, сам до конца еще не догнал, но постараюсь расписать: Записывается как nest(data), в результате которой Вложенные хранилища данных хранятся отдельные таблицы в пределах ячейки более крупной, организованной Таблица - это версия гугл транслейта. Кароч, nest вкладывает в одну ячейку данные более крупной таблицы. Функция отмены - unnest(data)
library(tidyr)
(iris) %>% nest(-Species) Species
1 setosa
2 versicolor
3 virginica
data
1 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0, 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3, 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1.0, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2
2 7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3.0, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8, 4.7, 4.5, 4.9, 4.0, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4.0, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4.0, 4.9, 4.7, 4.3, 4.4, 4.8, 5.0, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4.0, 4.4, 4.6, 4.0, 3.3, 4.2, 4.2, 4.2, 4.3, 3.0, 4.1, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1.0, 1.3, 1.4, 1.0, 1.5, 1.0, 1.4, 1.3, 1.4, 1.5, 1.0, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1.0, 1.1, 1.0, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1.0, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3
3 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9, 3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3.0, 2.5, 3.0, 3.4, 3.0, 6.0, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5.0, 5.1, 5.3, 5.5, 6.7, 6.9, 5.0, 5.7, 4.9, 6.7, 4.9, 5.7, 6.0, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5.0, 5.2, 5.4, 5.1, 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2.0, 1.9, 2.1, 2.0, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2.0, 2.0, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2.0, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2.0, 2.3, 1.8
Думаю пока все. Еще буду дополнять, если чего еще узнаю. Всем хорошего вечера!
All rights reserved
Шпаргалка по библиотеке stringr
При работе с текставыми данными, часто бывает необходимость очистки и подготовки их. stringr предоставляет нам ряд замечательных функций, предназначенных для максимально простой работы со строками. Всю информацию по данной библиотеке можно посмотреть по ссылке Link. С помощью данного пакета можно определять совпадения в тексте, считать количество символов, осуществлять выборку по заданному критерию, выбирать длину выражения или слов, изменять и заменять данные, разделять и объединять, менять порядок связей.
Разберем возможности библиотреки stringr на практике.
library(stringr)Все функции в stringr начинаются с str_ и берут вектор строк в качестве первого аргумента. Создаем вектор из некоторых слов. И следующим действием посчитаем сколько символов в каждом слове:
x <- c("why", "video", "cross", "extra", "deal", "authority")
str_length(x) [1] 3 5 5 5 4 9
Объединим вектор в одну строку через запятую:
str_c(x, collapse = ", ")[1] "why, video, cross, extra, deal, authority"
Извлечем из каждого слова первые две буквы:
str_sub(x, 1, 2)[1] "wh" "vi" "cr" "ex" "de" "au"
Большинство строковых функций работают с регулярными выражениями. Например, регулярное выражение «[aeiou]» соответствует любому одиночному символу, который является гласным.
Существуют основные операций, которые работают с шаблонами:
• str_detect (x, pattern) - сообщает, есть ли соответствие шаблону:
str_detect (x, "[aeiou]")[1] FALSE TRUE TRUE TRUE TRUE TRUE
• str_count (x, pattern) - подсчитывает количество шаблонов:
str_count (x, "[aeiou]")[1] 0 3 1 2 2 4
• str_subset (x, pattern) - извлекает соответствующие компоненты:
str_subset (x, "[aeiou]")[1] "video" "cross" "extra" "deal" "authority"
• str_locate (x, pattern) задает позицию совпадения:
str_locate (x, "[aeiou]") start end
[1,] NA NA
[2,] 2 2
[3,] 3 3
[4,] 1 1
[5,] 2 2
[6,] 1 1
• str_extract (x, pattern) - извлекает текст совпадения:
str_extract (x, "[aeiou]")[1] NA "i" "o" "e" "e" "a"
• str_match (x, pattern) - извлекает части совпадения, определенные скобками:
# извлекать символы с обеих сторон гласного
str_match(x, "(.)[aeiou](.)") [,1] [,2] [,3]
[1,] NA NA NA
[2,] "vid" "v" "d"
[3,] "ros" "r" "s"
[4,] NA NA NA
[5,] "dea" "d" "a"
[6,] "aut" "a" "t"
• str_replace (x, pattern, replacement) - заменяет совпадения новым текстом:
str_replace (x, "[aeiou]", "?")[1] "why" "v?deo" "cr?ss" "?xtra" "d?al" "?uthority"
• str_split (x, pattern) - разбивает строку на несколько частей:
str_split(c("a,b", "c,d,e"), ",")[[1]]
[1] "a" "b"
[[2]]
[1] "c" "d" "e"
Также мы можем использовать и другие опереции данной библиоттеки:
• str_which(string, pattern) - строки, содержащие совпадение шаблонов:
str_which(x, "[aeiou]")[1] 2 3 4 5 6
• str_trunc(string, width, side = c(“right”, “left”,“center”), ellipsis = “…”) - усечение ширины строки, заменяя содержимое на многоточие.
str_trunc(x,4)[1] "why" "v..." "c..." "e..." "deal" "a..."
• str_sub() <- value - заменить подстроки извлеченных данных и присваивая результаты:
str_sub(x,2,2) <- "st"• str_replace_all(string, pattern, replacement) - заменить все согласованные шаблоны в каждой строке:
str_replace_all(x, "a", "-")[1] "wsty" "vstdeo" "cstoss" "esttr-" "dst-l"
[6] "-stthority"
• str_to_lower(string, locale = “en”) - преобразование строки в нижний регистр (строчные буквы).
• str_to_upper(string, locale = “en”) - преобразование строки в верхний регистр (прописные буквы).
• str_to_title(string, locale = “en”) - преобразование первой буквы в прописную, для зоголовка:
str_to_title(x)[1] "Wsty" "Vstdeo" "Cstoss" "Esttra" "Dstal"
[6] "Astthority"
• str_pad(string, width, side = c(“left”, “right”, “both”), pad = " “) - регулировка ширины столбца.
• str_trim(string, side = c(“both”, “left”, “right”)) - орезать пробелы с начала и/или конца.
• str_dup(string, times) - повторять строки заданное количество раз:
[1] "wstywstywsty" "vstdeovstdeovstdeo"
[3] "cstosscstosscstoss" "esttraesttraesttra"
[5] "dstaldstaldstal" "astthorityastthorityastthority"
• str_split_fixed(string, pattern, n) - разделить вектор строку в матрицу подстрок.
• str_glue(…, .sep = “”, .envir = parent.frame()) - создание строки из строк и выражений.
• str_glue_data(.x, …, .sep = “”, .envir = parent.frame(), .na = “NA”) - используя датафрейм, список создание строки из строк и выражений.
• str_order(x, decreasing = FALSE, na_last = TRUE, locale = “en”, numeric = FALSE, …) - сортировка и вывод количественного значения данных вектора:
str_order(x)[1] 6 3 5 4 2 1
• str_sort(x, decreasing = FALSE, na_last = TRUE, locale = “en”, numeric = FALSE, …) - сортировка вектора:
str_sort(x,decreasing = TRUE)[1] "wsty" "vstdeo" "esttra" "dstal" "cstoss"
[6] "astthority"
Шпаргалка по библиотеке ggplot2 для визуализации данных в R.
library(ggplot2)
В примерах мы будем использовать встроенные данные mtcars и mpg.
1. Самый быстрый способ построить график - использовать функцию qplot. (a) Можно изменить цвет точек на графике по количеству цилиндров (cyl).
library(ggplot2)
data("mtcars")
mtcars$cyl <- as.factor(mtcars$cyl)qplot(mtcars$mpg, mtcars$disp, mtcars, color=mtcars$cyl)
(а) в этом графике binwidth=ширина столбца, fill=цвет внутри графика.
xlab, ylabqplot(mtcars$mpg, fill = mtcars$cyl, binwidth = 2)
Основные элементы:
data=данные
aes=визуальная схема
geom=геометрический объект
stat=статистическая трансформация
scale=шкала
coordinate=система координат
position adjustments=регулировка позиции
facets= панели.
*ggplot(data = <набор данных>, aes(x = <переменная для оси X>, y = <переменная для оси Y>) + geom_<тип геометрического объекта>( aes(<специфические визуальные свойства геом. объекта>), stat = <тип статистического преобразования>, position = <функция для регулировки позиции объектов> … ) + stat_<функция для статистического преобразования> + coordinate_<система координат> + scale_<функция для контроля визуальной разметки> + theme_<тема для графика> + facet_<функция панелирования>
На английском: *ggplot(data = ) + (mapping = aes( ), stat = , position = ) + + + +
ggplot(mtcars, aes(mpg, disp)) +
geom_point(aes(color = carb), size = 2.5, alpha = 0.8)
Как только произведена базовая настройка, вы можете добавлять на график слои с геометрическими объектами друг за другом. Геометрические объекты — маркеры, которые мы помещаем на график, например:**
Одна переменная:
geom_density() #alpha=n - прозрачность
geom_dotplot()
geom_histogram() для гистрограмм
geom_bar() для столбиковых диаграмм
Две переменные:
geom_point() для диаграмм рассеивания, они же scatterplot
geom_line() для временных рядов (линии)
geom_text() для текстовых аннотаций
geom_boxplot()
geom_violin()
geom_dotplot()
ggplot(mtcars, aes(mpg,disp))+geom_point(aes(colour=cyl, size = qsec))
ggplot(mtcars, aes(mpg))+geom_density(aes(fill=cyl), alpha=0.5)
ggplot(mtcars, aes(mpg, disp, group=cyl))+geom_boxplot(varwidth=T)
ggplot(data=mpg, aes(manufacturer)) + geom_bar(aes(fill=class), width = 0.5)+
theme(axis.text.x = element_text(angle=65)) #регулируем подписи к столбикам, angle-наклона текста
Scatterplot не требует никаких преобразований, тк каждая точка получает координаты x и y и наносится на график в соответствии с их оригинальными значениями. НО эта функция будет полезна для гистограмм и диаграмм размахов. Отображение статистически преобразованной переменной: измените значение по умолчанию в геометрии: geom_bar(stat=“count”). Стандартный геометрический объект для stat_bin - это geom_bar.
Настраивает каким образом геометрические объекты расположены относительно друг друга.
identity - позиция по умолчанию в большинстве случаев. Геометрические объекты наносятся на график в соответствии с их фактическими значениями x и y
jitter:geom_point(position=“jitter”) - добавляет случайный шум к позициям x или y. Используется, как правило, для точек.
stack: geom_bar(position=“stack”)- складывает геометрические объекты друг на друга. Позиция по умолчанию для столбиковых диаграмм.
dodge:geom_bar(position=“dodge”) - выстраивает объекты в ряд слева и справа друг от друга.
fill: geom_bar(position=“fill”) - складывает объекты друг на друга расширяя или сужая их таким образом, чтобы заполнить пространство от 0 до 1. Позиция удобна для отображения пропорций *color=“black” это контур столбцов.
data(mpg)
ggplot(mpg, aes(fl, fill = drv))+geom_bar(position = "dodge", color="black")
ggplot(mpg, aes(fl, fill = drv))+geom_bar(position = "stack", color="black")
ggplot(mpg, aes(fl, fill = drv, ))+geom_bar(position = "fill", color="black")
Углубленно мы не изучали эту функцию ggplot. Будет полезна для построения круговых диаграмм.
pie <- ggplot(mtcars, aes("", fill = cyl)) +
geom_bar(position = "fill", color = "black")+
coord_polar(theta = "y") # Переменная theta определяет угловые координаты
pie
Разбивает на подграфики. Есть два способа разбиения:
facet_wrap() определяет подмножества как уровни одной группирующей переменнойfacet_grid() определяет подмножества как пересечение двух группирующих переменныхggplot(mpg, aes(cty, hwy)) + geom_point()+facet_grid(year~.) #Панель разбита по годам
ggplot(mpg, aes(cty, hwy)) + geom_point()+facet_grid(.~fl) #Разбивает на панели по переменной fl
Labs добавляют заголовок и названия для осей координат: - title - заголовок - subtitle -подзаголовок - caption - подпись под графиком.
Функция scale_color_continuous имеет аргументы low и high , чтобы задать цвет на верхней и нижней границах шкалы.
Варианты:
ggplot(mpg, aes(displ)) + scale_fill_brewer(palette = "Spectral")+
geom_histogram(aes(fill=class),
binwidth = 0.1,
col="black",
size=.1) + #меняем binwidth
labs(title="Histogram with Auto Binning", subtitle="Engine Displacement across Vehicle Classes")
Можно сохранить график использую клавишу Export в RStudio или команду ggsave
Далее:
Cheatsheet по библиотеке XGBOOST
**ibrary(xgboost)**
можно либо через install.packages(‘xgboost’), либо загрузить еженедельно обновляемую версию с репозитория. Пользователям Windows нужно сначала установить RTools.
install.packages(“drat”, repos=“https://cran.rstudio.com”)
drat:::addRepo(“dmlc”)
install.packages(“xgboost”, repos=“http://dmlc.ml/drat/”, type=“source”)
XGBOOST - библиотека, разработанная и оптимизированная под бустинг алгоритмов деревьев. Ключевой алгоритм xgboost по сути является продолжением классического gbm алгоритма, только в 10 раз быстрее. Используя многопоточность и применяя регуляризацию, xgboost способен использовать б`ольшие вычислительной мощности и делать более точный прогноз. Многократный победитель kaggle соревнований.
Немного теории
Идея градиентного бустинга состоит в построении ансамбля последовательно уточняющих друг друга элементарных моделей. n-ная элементарная модель обучается на “ошибках” ансамбля из n-1 моделей, ответы моделей взвешенно суммируются. В XGBoost поддерживаются три основные формы повышения градиента:
Алгоритм Gradient Boosting также называется градиентной машиной повышения, включая скорость обучения.
Stochastic Gradient Boosting с суб-выборкой в строке, столбце и столбце на каждый уровень разделения.
Регулярное усиление градиента с регуляцией L1 и L2.
Библиотека предоставляет систему для использования в различных вычислительных средах, не в последнюю очередь:
Параллелизацию построения дерева с использованием всех ваших ядер процессора во время обучения.
Распределенные вычисления для обучения очень крупных моделей с использованием кластера машин.
Внекорпоративные вычисления для очень больших наборов данных, которые не вписываются в память.
Кэш Оптимизацию структуры данных и алгоритма для наилучшего использования аппаратного обеспечения.
Основной функцией xgboost для создания моделей является xgb.train. Также доступна функция xgboost с более простым интерфейсом. Данные для xgb.train должны быть в формате xgb.DMatrix, в то время как xgboost также принимает на вход обычные матрицы matrix и разреженные матрицы dgCMatrix. Используем встроенную библиотеку данных agaricus.
library(xgboost)
data("agaricus.train")
data("agaricus.test")
train <- agaricus.train
test <- agaricus.test
bst <- xgboost(data = train$data, label = train$label, max.depth = 4, nround = 3, objective = "binary:logistic")[1] train-error:0.006142
[2] train-error:0.006756
[3] train-error:0.001228
Создадим объекты класса xgb.DMatrix с обучающей и тестовой выборками. Необходимо задать матрицу признаков и вектор ответов.
5(a) Параметры xgboost
Полный список параметров весьма обширен и состоит из:
общих параметров (главный из них - тип бустера);
параметров, специфичных для каждого бустера;
параметров решаемой задачи.
Пакет xgboost реализует бустинг на основе деревьев (booster = “gbtree” - вариант по умолчанию) и его модификацию DART (booster = “dart”), а также бустинг на основе линейных моделей (booster = “gblinear”). Мы рассмотрим первые два, поскольку бустинг линейных моделей обычно менее результативен.
Если очень кратко
Параметры max_depth, min_child_weight и gamma непосредственно ограничивают сложность модели, subsample и colsample_bytree делают её более устойчивой к шуму за счет добавления случайного выбора наблюдений и предикторов, eta влияет на скорость обучения.
Если не очень
5(b) Общие параметры:
5(c) Параметры бустера:
5(d) Параметры решаемой задачи.
Эти параметры определяют методы функции потерь и оценки модели. В дополнение к перечисленным ниже параметрам вы можете использовать настраиваемую функцию objective / evaluation.
Строим модель
xgb.train и подготовка данныхНа вход модель принимает данные в виде Dense (плотных) матриц с нулями и Sparse (разреженых) матриц без нулей: dgCMatrix. Каждая переменная в датасете является списком (list), который содержит label и data.
label - результат нашего датасета, то есть это бинарная классификация, которую мы постараемся спрогнозировать.
data("agaricus.test")
data("agaricus.train")
dtrain <- xgb.DMatrix(data=agaricus.train$data,label=agaricus.train$label)
dtest <- xgb.DMatrix(data=agaricus.test$data,label=agaricus.test$label)
watchlist = list(train=dtrain,test=dtest) #список xgb.DMatrix с тэгами
table(agaricus.train$label)
0 1
3373 3140
bst <- xgboost(data=dtrain,
nrounds=20000,
eval_metric='auc',
objective= "reg:linear",
max_depth=4,
subsample_bytree=0.7,
nthread=4,
maximize = F,
early_stopping_rounds = 10)[1] train-auc:0.994042
Will train until train_auc hasn't improved in 10 rounds.
[2] train-auc:0.999470
[3] train-auc:0.999470
[4] train-auc:0.999599
[5] train-auc:0.999602
[6] train-auc:0.999602
[7] train-auc:1.000000
[8] train-auc:1.000000
[9] train-auc:1.000000
[10] train-auc:1.000000
[11] train-auc:1.000000
Stopping. Best iteration:
[1] train-auc:0.994042
pred <- predict(bst, dtest) #Проверка на тестовой выборке
xgbpred <- ifelse (pred > 0.5,1,0)Xgboost работает только с числовыми переменными (numeric). Если в датасете присутствуют качественные переменные (categorical), их нужно будет конвертировать в числовые.
library(caret)
data("diamonds")
index <- createDataPartition(diamonds$cut, p=0.7, list = FALSE)
train2 <- diamonds[index,]
test2 <- diamonds[-index,]
#обязательное условие для ЗП - быть кол-венной переменной, конвертируем в числовые:
train_labels <- as.integer((train2$cut))
test_labels <- as.integer((test2$cut))
#обязательное условие для НП - быть матрицей
trainM <- data.matrix(train2[,-2])
testM <- data.matrix(test2[,-2])
Mtrain <- xgb.DMatrix(data=trainM, label=train_labels)
Mtest <- xgb.DMatrix(data=testM, label=test_labels)6(а) Подсказки
xgb.cv (кросс-валидация)Формула: xgb.cv(params = list(), data, nrounds, nfold, label = NULL, missing = NA, prediction = FALSE, showsd = TRUE, metrics = list(), obj = NULL, feval = NULL, stratified = TRUE, folds = NULL, verbose = TRUE, print_every_n = 1L, early_stopping_rounds = NULL, maximize = NULL, callbacks = list(), …)
cv <- xgb.cv(data=dtrain,
nrounds=20000,
eval_metric='auc',
objective= "reg:linear",
max_depth=4,
subsample_bytree=0.7,
nthread=4,
maximize = F,
early_stopping_rounds = 10,
nfold=10) # первичные данные будут случайно поделены на равные подвыборки[1] train-auc:0.995726+0.002242 test-auc:0.993605+0.003832
Multiple eval metrics are present. Will use test_auc for early stopping.
Will train until test_auc hasn't improved in 10 rounds.
[2] train-auc:0.999434+0.000136 test-auc:0.999502+0.000996
[3] train-auc:0.999489+0.000121 test-auc:0.999502+0.000996
[4] train-auc:0.999591+0.000098 test-auc:0.999502+0.000996
[5] train-auc:0.999595+0.000096 test-auc:0.999502+0.000996
[6] train-auc:0.999770+0.000208 test-auc:0.999472+0.001061
[7] train-auc:0.999953+0.000098 test-auc:0.999472+0.001061
[8] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864
[9] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864
[10] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864
[11] train-auc:0.999983+0.000051 test-auc:0.999712+0.000864
Stopping. Best iteration:
[1] train-auc:0.995726+0.002242 test-auc:0.993605+0.003832
print(cv)##### xgb.cv 10-folds
iter train_auc_mean train_auc_std test_auc_mean test_auc_std
1 0.9957259 2.241560e-03 0.9936046 0.0038324799
2 0.9994341 1.362875e-04 0.9995025 0.0009958047
3 0.9994887 1.205513e-04 0.9995025 0.0009958047
4 0.9995915 9.758099e-05 0.9995025 0.0009958047
5 0.9995950 9.590203e-05 0.9995025 0.0009958047
6 0.9997700 2.075693e-04 0.9994723 0.0010608663
7 0.9999533 9.775280e-05 0.9994723 0.0010608663
8 0.9999831 5.070000e-05 0.9997121 0.0008637000
9 0.9999831 5.070000e-05 0.9997121 0.0008637000
10 0.9999831 5.070000e-05 0.9997121 0.0008637000
11 0.9999831 5.070000e-05 0.9997121 0.0008637000
Best iteration:
iter train_auc_mean train_auc_std test_auc_mean test_auc_std
1 0.9957259 0.00224156 0.9936046 0.00383248
7(b) Ранняя остановка модели (early stopping)
Этот параметр используется, когда мы не знаем сколько деревьев нам нужно построить. Установив параметр early_stopping, xgboost завершит процесс обучения, если производительность ухудшится при последующих итерациях.
param <- list(booster = "gbtree", #параметры
max.depth = 6,
eta = 0.1,
gamma = 0,
subsample = 1,
colsample_bytree = 0.4,
min_child_weight = 1,
objective = "reg:linear")
xgbcv <- xgb.cv(params=param, data = dtrain, label = agaricus.train$label, nfold = 5,
nrounds = 20,
early_stopping_rounds = 5, maximize = F)[1] train-rmse:0.451225+0.000061 test-rmse:0.451384+0.000469
Multiple eval metrics are present. Will use test_rmse for early stopping.
Will train until test_rmse hasn't improved in 5 rounds.
[2] train-rmse:0.407383+0.000170 test-rmse:0.407647+0.000749
[3] train-rmse:0.368095+0.000358 test-rmse:0.368450+0.000996
[4] train-rmse:0.332861+0.000489 test-rmse:0.333378+0.001368
[5] train-rmse:0.301126+0.000638 test-rmse:0.301675+0.001530
[6] train-rmse:0.272636+0.000661 test-rmse:0.273272+0.001865
[7] train-rmse:0.247157+0.000707 test-rmse:0.248046+0.002371
[8] train-rmse:0.224212+0.000803 test-rmse:0.225113+0.002585
[9] train-rmse:0.203653+0.000730 test-rmse:0.204906+0.003046
[10] train-rmse:0.185152+0.000723 test-rmse:0.186565+0.003301
[11] train-rmse:0.168837+0.000857 test-rmse:0.170594+0.003816
[12] train-rmse:0.154325+0.000859 test-rmse:0.156237+0.004057
[13] train-rmse:0.141267+0.001117 test-rmse:0.143293+0.004213
[14] train-rmse:0.129802+0.001157 test-rmse:0.132228+0.004576
[15] train-rmse:0.119657+0.001403 test-rmse:0.122138+0.004731
[16] train-rmse:0.110813+0.001518 test-rmse:0.113594+0.005128
[17] train-rmse:0.102907+0.001739 test-rmse:0.105762+0.005323
[18] train-rmse:0.095910+0.001727 test-rmse:0.099214+0.005742
[19] train-rmse:0.089495+0.001780 test-rmse:0.093060+0.005662
[20] train-rmse:0.083912+0.001597 test-rmse:0.087876+0.006237
7(c) Также можно посмотреть на ошибку кросс-валидации:
min(xgbcv$test.error.mean)[1] Inf
Если дерево слишком глубокое или количество параметров велико, тогда будет сложно найти какие-либо важные паттерны. Есть простой способ проверить важность предикторов. Проверка статистической значимости переменных в модели подскажет нам как оптимизировать матрицу предикторов для обучения XGB-модели. Лучше всего использовать функцию xgb.plot.importance в которую мы передадим агрегированную таблицу важности параметров.
bst <- xgboost(data = agaricus.train$data,
label=agaricus.train$label,
max.depth = 2,
eta = 0.1, nthread = 2,
nround = 2,
objective = "binary:logistic")[1] train-error:0.046522
[2] train-error:0.041609
importance_matrix <- xgb.importance(agaricus.train$data@Dimnames[[2]], model = bst)При оценке нашей модели, можно ее визуализировать:
library(Ecdat)
devtools::install_github("rich-iannone/DiagrammeR",force=T)
#library(DiagrammeR)
train <- agaricus.train
bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
eta = 1, nthread = 2, nround = 2,objective = "binary:logistic")[1] train-error:0.046522
[2] train-error:0.022263
#train$data@Dimnames[[2]] - название колонки в матрице:
#xgb.plot.tree(train$data@Dimnames[[2]], model = bst)ROC-curve
table(agaricus.test$label,round(pred))
library(ROSE)
roc.curve(agaricus.test$label,pred)
0 1
0 823 12
1 0 776
Area under the curve (AUC): 0.993
Тут не работает стандартная формула, но принцип должен быть ясен:
library(caret)
#confusionMatrix(pred, agaricus.test$label) - стандартная формула, но пришлось решить через table:
u <- union(pred, agaricus.test$label)
t <- table(factor(pred, u), factor(agaricus.test$label, u))
confusionMatrix(t)Confusion Matrix and Statistics
0.350358009338379 0.646413385868073 0.35049706697464
0.350358009338379 0 0 0
0.646413385868073 0 0 0
0.35049706697464 0 0 0
0.35384613275528 0 0 0
0.350943386554718 0 0 0
0.647222220897675 0 0 0
0.645312488079071 0 0 0
0.361538469791412 0 0 0
0.645454525947571 0 0 0
0 0 0 0
1 0 0 0
0.35384613275528 0.350943386554718 0.647222220897675
0.350358009338379 0 0 0
0.646413385868073 0 0 0
0.35049706697464 0 0 0
0.35384613275528 0 0 0
0.350943386554718 0 0 0
0.647222220897675 0 0 0
0.645312488079071 0 0 0
0.361538469791412 0 0 0
0.645454525947571 0 0 0
0 0 0 0
1 0 0 0
0.645312488079071 0.361538469791412 0.645454525947571
0.350358009338379 0 0 0
0.646413385868073 0 0 0
0.35049706697464 0 0 0
0.35384613275528 0 0 0
0.350943386554718 0 0 0
0.647222220897675 0 0 0
0.645312488079071 0 0 0
0.361538469791412 0 0 0
0.645454525947571 0 0 0
0 0 0 0
1 0 0 0
0 1
0.350358009338379 94 0
0.646413385868073 12 744
0.35049706697464 681 0
0.35384613275528 10 0
0.350943386554718 34 0
0.647222220897675 0 19
0.645312488079071 0 9
0.361538469791412 4 0
0.645454525947571 0 4
0 0 0
1 0 0
Overall Statistics
Accuracy : 0
95% CI : (0, 0.0023)
No Information Rate : 0.5183
P-Value [Acc > NIR] : 1
Kappa : 0
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: 0.350358009338379 Class: 0.646413385868073
Sensitivity NA NA
Specificity 0.94165 0.5307
Pos Pred Value NA NA
Neg Pred Value NA NA
Prevalence 0.00000 0.0000
Detection Rate 0.00000 0.0000
Detection Prevalence 0.05835 0.4693
Balanced Accuracy NA NA
Class: 0.35049706697464 Class: 0.35384613275528
Sensitivity NA NA
Specificity 0.5773 0.993793
Pos Pred Value NA NA
Neg Pred Value NA NA
Prevalence 0.0000 0.000000
Detection Rate 0.0000 0.000000
Detection Prevalence 0.4227 0.006207
Balanced Accuracy NA NA
Class: 0.350943386554718 Class: 0.647222220897675
Sensitivity NA NA
Specificity 0.9789 0.98821
Pos Pred Value NA NA
Neg Pred Value NA NA
Prevalence 0.0000 0.00000
Detection Rate 0.0000 0.00000
Detection Prevalence 0.0211 0.01179
Balanced Accuracy NA NA
Class: 0.645312488079071 Class: 0.361538469791412
Sensitivity NA NA
Specificity 0.994413 0.997517
Pos Pred Value NA NA
Neg Pred Value NA NA
Prevalence 0.000000 0.000000
Detection Rate 0.000000 0.000000
Detection Prevalence 0.005587 0.002483
Balanced Accuracy NA NA
Class: 0.645454525947571 Class: 0 Class: 1
Sensitivity NA 0.0000 0.0000
Specificity 0.997517 1.0000 1.0000
Pos Pred Value NA NaN NaN
Neg Pred Value NA 0.4817 0.5183
Prevalence 0.000000 0.5183 0.4817
Detection Rate 0.000000 0.0000 0.0000
Detection Prevalence 0.002483 0.0000 0.0000
Balanced Accuracy NA 0.5000 0.5000
10. XGBoost и Random Forest
Благодаря экспериментальному параметру num_parallel_tree можно задать количество одновременно создаваемых деревьев и представить Random Forest как частный случай бустинговой модели с одной итерацией. А если использовать больше одной итерации, то получится бустинг “случайных лесов”, когда каждый “случайный лес” выступает в качестве элементарной модели. Разница между Random Forest и XGBoost в том, что в лесу деревья строятся независимо, а в xgboost дереве N+1 фокусирует обучение на том, что было недомоделировано предыдущим.
train <- agaricus.train
test <- agaricus.test
#Random Forest - 1000 trees
bst <- xgboost(data = train$data, label = train$label, max.depth = 4, num_parallel_tree = 1000, subsample = 0.5, colsample_bytree =0.5, nround = 1, objective = "binary:logistic")[1] train-error:0.014279
param <- list(booster = "gbtree", #параметры
max.depth = 25,
eta = 1,
gamma = 0,
subsample = 1,
colsample_bytree = 0.4,
min_child_weight = 1,
num_parallel_tree = 200,
objective = "reg:linear", eval_metric = "rmse")
set.seed(100)
fit2 <- xgb.train(data = dtrain,
nrounds = 5,
params = param,
verbose = 1,
watchlist = list(train = dtrain, test = dtest))[1] train-rmse:0.041519 test-rmse:0.047040
[2] train-rmse:0.028666 test-rmse:0.032915
[3] train-rmse:0.027666 test-rmse:0.031937
[4] train-rmse:0.027589 test-rmse:0.031869
[5] train-rmse:0.027583 test-rmse:0.031865
# Сохраняем матрицу
xgb.DMatrix.save(dtrain, "dtrain.buffer") [1] TRUE
# Сохраняем модель
xgb.save(bst, "xgboost.model")[1] TRUE
# Загружаем модель в консоль
bst2 <- xgb.load("xgboost.model")Далее:
XGBfi - XGBoost Feature Interactions & Importance
Методы, основанные на построении деревьев, преводсходят другие в способности использовать/распознавать взаимодействие признаков. При построении дерево выбирает взаимодействие признаков/предикторов. Например, на то купите ли вы мороженое скорее повлияет не наличие у вас лишних денег, а тот факт жарко на улице или нет. Но взаимодействие двух этих предикторов может сильно повлиять на то, купите ли вы мороженое.
Традиционный способ для оценки признаков основывается на оценке важности предикторов (feature importance). Однако, такая оценка не позволяет выяснить взаимодействия предикторов второго и третьего порядка. Определение этих взаимодействий имеет важное значение для создания более точных моделей, особенно при поиске предикторов для линейных моделей.
xgbfi очень хорошо работает на больших объемах данных, когда сложно выяснить взаимодействие разных параметров. Мы будем смотреть функцию на примере встроенных данных Icecream. Библиотека Ecdat нужна, чтобы сработала команда xgb.plot.tree
bst <- xgboost(data = train.data,
label = Icecream$cons,
max.depth = 3, eta = 1, nthread = 2,
nround = 2, objective = "reg:linear")[1] train-rmse:0.034907
[2] train-rmse:0.023540
Чтобы лучше понять как работает модель, мы можем построить график дерево, чтобы посмотреть на важные предикторы.
xgb.plot.tree(feature_names = names((Icecream[,-1])), model = bst)
xgb.importance(colnames(train.data, do.NULL = TRUE, prefix = "col"), model = bst) Feature Gain Cover Frequency
1: temp 0.75047187 0.66896552 0.4444444
2: income 0.18846270 0.27586207 0.4444444
3: price 0.06106542 0.05517241 0.1111111
Все это знакомо для тех, кто уже пользовался деревом решений для создания модели. Но что делать с взаимодействием переменных второго или третьего уровня. Как составить их рейтинг?
Следующим шагом будет сохранение дерева и перемещение его из R, чтобы xgbfi смог парсить дерево. Этот код поможет создать два необходимых файла: xgb.dump и fmap.text.
featureList <- names(Icecream[,-1])
featureVector <- c()
#Тут абсолютный плагиат, код хорошо бы разобрать
for (i in 1:length(featureList)) {
featureVector[i] <- paste(i-1, featureList[i], "q", sep="t")
}
write.table(featureVector, "fmap.txt", row.names=FALSE, quote = FALSE, col.names = FALSE)
xgb.dump(model = bst, fname = 'xgb.dump', with_stats = FALSE, dump_format = c("text", "json"))[1] TRUE
3. Как пользоваться xgbfi
Первым шагом будет копирование репозитория xgbfi на ваш компьютер.
3(a). Для этого
Зайти на страницу репозитория и скачать его, нажав на кнопку download, а также скопировать url. Для этого нужно будет установить приложение github desktop.
Репозиторий скопируется на ваш компьютер в ту директорию, которой вы обычно пользуетесь (можете поменять).Затем скопируйте файлы xgb.dump и fmap.text в директорию bin в папке C:.
3(b). XgbFeatureInteractions.exe
Перейдите в терминал или в командной строке (вызов cmd) и запустите приложение XgbFeatureInteractions.exe, это приложение находится в папке bin и его можно запустить вручную. Существует также файл XgbFeatureInteractions.exe.config, содержащий параметры конфигурации в директории bin.
После запуска приложения он выведет таблицу Excel (в этой же папке) с названием: XgbFeatureInteractions.xlsx. Откройте таблицу и вы увидите:
Эта вкладка excel покажет взаимодействия первого уровня. Результаты схожи с тем, что показала оценка важности предикторов. Если вы посмотрите вкладку Interaction Depth 1 или Interaction Depth 2. Теперь можно ранжировать взаимодействия более высокого порядка. С простым набором данных как Icecream вы видите, что результаты из xgbfi соответствуют тому, что происходит в дKереве. Реальная ценность этого инструмента проявляется при использовании в больших наборах данных, где трудно исследовать деревья для выяснения взаимодействий.
Теперь вы обладаете секретным знанием, пользуйтесь им ответственно.
Случайный лес (Random forest)
Алгоритм был разработан для улучшения предсказывающих качеств деревьев и основан на построении большого количества разных деревьев. Ценой улучшения предсказывающих способностей является ухудшение интерпретируемости результатов
Принцип работы: каждое дерево голосует за определенный результат, предсказанием модели является прогноз с наибольшим количеством голосов
Основные параметры случайного леса:
Минимальное количество наблюдений в подмножестве (nodesize)
Количество деревьев (ntree)
Загрузка библиотеки
Генерирование случайного леса для обучения
setosa versicolor virginica
setosa 35 0 0
versicolor 0 28 4
virginica 0 3 29
Распечатка модели Random Forest и посмотр важных функций
Call:
randomForest(formula = Species ~ ., data = trainData, ntree = 100, proximity = TRUE)
Type of random forest: classification
Number of trees: 100
No. of variables tried at each split: 2
OOB estimate of error rate: 7.07%
Confusion matrix:
setosa versicolor virginica class.error
setosa 35 0 0 0.00000000
versicolor 0 28 3 0.09677419
virginica 0 4 29 0.12121212
Иллюстрация
plot(iris_rf)
MeanDecreaseGini
Sepal.Length 6.106949
Sepal.Width 2.010273
Petal.Length 26.963992
Petal.Width 30.082766
varImpPlot(iris_rf)
irisPred setosa versicolor virginica
setosa 15 0 0
versicolor 0 19 0
virginica 0 0 17
увидеть маржу, положительную или отрицательную, если она означает правильную классификацию {}
plot(margin(iris_rf,testData$Species))
Объединение еще два ансамбля деревьев в один.
Call:
randomForest(formula = Species ~ ., data = iris, ntree = 50, norm.votes = FALSE)
Type of random forest: classification
Number of trees: 150
No. of variables tried at each split: 2
Опция getTree
getTree(rfobj, k=1, labelVar=FALSE)
rfobj - объект randomForest
k выбор какого именно дерева?
labelVar Использование метки для разделения переменных и прогнозируемого класса
Пример рассматриваем 3 дерево из всего леса
left daughter строка, где находится левый дочерний узел; 0, если узел является терминальным
right daughter строка, в которой находится правый дочерний узел; 0, если узел является терминальным
split var какая переменная использовалась для разделения узла; 0, если узел является терминальным
split point точка разделения
status положение дел
is the node terminal (-1) or not (1)
the prediction for the node; 0 if the node is not terminal
left daughter right daughter split var split point status prediction
1 2 3 Petal.Length 2.45 1 <NA>
2 0 0 <NA> 0.00 -1 setosa
3 4 5 Sepal.Length 5.75 1 <NA>
4 6 7 Petal.Width 1.75 1 <NA>
5 8 9 Sepal.Length 7.05 1 <NA>
6 0 0 <NA> 0.00 -1 versicolor
7 0 0 <NA> 0.00 -1 virginica
8 10 11 Petal.Width 1.70 1 <NA>
9 0 0 <NA> 0.00 -1 virginica
10 12 13 Sepal.Width 2.85 1 <NA>
11 14 15 Petal.Length 4.85 1 <NA>
12 16 17 Petal.Length 4.80 1 <NA>
13 0 0 <NA> 0.00 -1 versicolor
14 18 19 Sepal.Width 3.10 1 <NA>
15 0 0 <NA> 0.00 -1 virginica
16 0 0 <NA> 0.00 -1 versicolor
17 20 21 Petal.Width 1.55 1 <NA>
18 0 0 <NA> 0.00 -1 virginica
19 0 0 <NA> 0.00 -1 versicolor
20 0 0 <NA> 0.00 -1 virginica
21 0 0 <NA> 0.00 -1 versicolor
Опция grow добавление дополнительных деревьев в существующий ансамбль деревьев grow(x, how.many, …), x объект класса randomForest, который содержит лесной компонент, how.many количество деревьев для добавления к объекту randomForest.
Call:
randomForest(formula = Species ~ ., data = iris, ntree = 50, norm.votes = FALSE)
Type of random forest: classification
Number of trees: 100
No. of variables tried at each split: 2
Извлечение переменной важности
%IncMSE IncNodePurity
cyl 17.105727 186.48048
disp 19.988462 245.70827
hp 17.449754 191.13085
drat 6.866872 67.66617
wt 17.849921 233.19790
qsec 5.238511 33.91407
vs 4.723536 28.56053
am 5.103218 14.76874
gear 4.145003 21.21196
carb 6.670874 28.91842
%IncMSE
cyl 17.105727
disp 19.988462
hp 17.449754
drat 6.866872
wt 17.849921
qsec 5.238511
vs 4.723536
am 5.103218
gear 4.145003
carb 6.670874
MDSplot(rf, fac, k=2, palette=NULL, pch=20, …) Построение масштабных координат матрицы близости от randomForest
rf объект класса randomForest, который содержит компонент близости.
fac фактор, который использовался в качестве ответа для обучения rf.
k количество измерений для масштабирующих координат.
palette цвета, используемые для различения классов; длина должна быть равна числу уровней
pch отображение символов для использования
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)
MDSplot(iris.rf, iris$Species, palette=rep(1, 3), pch=as.numeric(iris$Species))
Call:
randomForest(formula = Species ~ ., data = iris.na, na.action = na.roughfix)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 2
OOB estimate of error rate: 4.67%
Confusion matrix:
setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 46 4 0.08
virginica 0 3 47 0.06
outlier Вычислить отдаленные меры
iris.rf <- randomForest(iris[,-5], iris[,5], proximity=TRUE)
plot(outlier(iris.rf), type="h",
col=c("red", "green", "blue")[as.numeric(iris$Species)])
График частичной зависимости x an объекта класса randomForest, который содержит лесной компонент. ### pred.data прогнозные данные, используем/ для построения графика, обычно данные обучения, используемые для построения случайного леса. ### x.var name of the variable for which partial dependence is to be examined. ###which.class For classification data, the class to focus on (default the first class). ##w weights to be used in averaging; if not supplied, mean is not weighted ## plot whether the plot should be shown on the graphic device. ##add whether to add to existing plot (TRUE). ##n.pt if x.var is continuous, the number of points on the grid for evaluating partial dependence. ##rug whether to draw hash marks at the bottom of the plot indicating the deciles of x.var. ## xlab label for the x-axis. ## ylab label for the y-axis. ## main main title for the plot.
data(iris)
set.seed(543)
iris.rf <- randomForest(Species~., iris)
partialPlot(iris.rf, iris, Petal.Width, "versicolor")
predicted
observed setosa versicolor virginica
setosa 5 0 0
versicolor 0 8 2
virginica 0 1 14
int [1:30, 1:500] 10 10 10 10 10 13 9 13 13 15 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:30] "18" "25" "40" "44" ...
..$ : chr [1:500] "1" "2" "3" "4" ...
prophet
5 июня 2018 г
Прогнозирование временных рядов — это достаточно популярная аналитическая задача. Прогнозы используются, например, для понимания, сколько серверов понадобится online-сервису через год, каков будет спрос на каждый товар в гипермаркете, или для постановки целей и оценки работы команды (для этого можно построить baseline прогноз и сравнить фактическое значение с прогнозируемым).
Существует большое количество различных подходов для прогнозирования временных рядов, такие как ARIMA, ARCH, регрессионные модели, нейронные сети и т.д. Рассмотрим как работает библитоека prophet
По своей сути, процедура prophet является аддитивной моделью регрессии с четырьмя основными компонентами:
Если расмотреть формулу prophet, то это выглядит примерно так:
additive regression model, состоящая из следующих компонент: y(t) = g(t) + s(t) + h(t) + _{t}
Сезонные компоненты s(t) отвечают за моделирование периодических изменений, связанных с недельной и годовой сезонностью. Недельная сезонность моделируется с помощью dummy variables. Добавляются 6 дополнительных признаков, например, [monday, tuesday, wednesday, thursday, friday, saturday], которые принимают значения 0 и 1 в зависимости от даты. Признак sunday, соответствующий седьмому дню недели, не добавляют, потому что он будут линейно зависеть от других дней недели и это будет влиять на модель. Годовая же сезонность моделируется рядами Фурье.
Тренд g(t) — это кусочно-линейная или логистическая функция. С линейной функцией все понятно. Логистическая же функция вида g(t) = позволяет моделировать рост с насыщением, когда при увеличении показателя снижается темп его роста. Типичный пример — это рост аудитории приложения или сайта. Кроме всего прочего, библиотека умеет по историческим данным выбирать оптимальные точки изменения тренда. Но их также можно задать и вручную (например, если известны даты релизов новой функциональности, которые сильно повлияли на ключевые показатели).
Компонента h(t) отвечает за заданные пользователем аномальные дни, в том числе и нерегулярные, такие как, например, Black Fridays.
Ошибка _{t} содержит информацию, которая не учтена моделью.
Не все проблемы прогнозирования могут быть решены по той же процедуре. Пророк оптимизирован для задач бизнес-прогноза, с которыми создатели библиотеки столкнулись в Facebook, которые обычно имеют одну из следующих характеристик:
Модель можно оценивать с помощью MAPE (mean absolute percentage error) — это средняя абсолютная ошибка нашего прогноза
Cтоит сказать пару слов о тех алгоритмах, с которыми сравнивали Prophet в публикации про prophet (https://research.fb.com/prophet-forecasting-at-scale/), тем более, большинство из них очень простые и их часто используют как базовые:
Давайте расмотрим на практике как работает prophet. Прогноз мы будем делать на данных курса валют, а точнее стоимость одного рубля в тенге. В данных курс рубля в тенге с 2008 года.
Загружаем библиотеки:
Подгрузим датасет и посмотри на первые 6 строк
Загрузим данные и посмотрим на них
V1 data curs
1: 1 2008-06-03 5.080939
2: 2 2008-06-04 5.095567
3: 3 2008-06-05 5.072486
4: 4 2008-06-06 5.068038
5: 5 2008-06-07 5.094477
6: 6 2008-06-08 5.119856
Интерфейс prophet подстроен под такие переменные как ds, y. На вход он получает эти две переменные и строит прогноз.
Снизу мы перейменовали колонки в ds и y
Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).
делаем make_future_dataframe и указываем periods = 120 дней. Можно указать больше дней, но чем больше дней мы указываем те больше коридор ошибки
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
Функция predict делает предсказание и вставляет в переменную forecast
В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:
ds yhat yhat_lower yhat_upper
2597 2018-09-30 5.760762 5.464978 6.048714
2598 2018-10-01 5.812712 5.510893 6.097445
2599 2018-10-02 5.828678 5.530629 6.132679
2600 2018-10-03 5.831263 5.548069 6.121898
2601 2018-10-04 5.836997 5.536304 6.102858
2602 2018-10-05 5.843490 5.557737 6.142455
Библиотека предоставляет удобные методы визуализации. Первый метод Prophet.plot отображает график прогноза
plot(m, forecast)
Второй метод Prophet.plot_components позволяет визуализировать отдельные компоненты: тренд, праздники, годовую и недельную сезонность:
prophet_plot_components(m, forecast)
К началу весны и к началу осени ожидается сезонное подорожание рубля. Данный прогноз основан на сезонном колебании валют и не учитывает ни внешние, ни внутренние факторы.
Насыщенные прогнозы
Прогнозирование роста с помощью “cap” и “floor”
По умолчанию Prophet использует линейную модель для своего прогноза. При прогнозировании роста обычно существует максимальная достижимая точка: общий размер рынка, общий размер населения и т. д. а также есть найменьшая точка, где бизнесу стоит паниковать и прощитывать риски
Давайте для нашего прогноза добавим точки “cap” и “floor”. Мы должны указать пропускную способность в столбце “cap” и “floor”. Здесь мы примем конкретное значение, но это обычно устанавливается с использованием данных или опыта о размере рынка.
Важно отметить, что они “cap” должны быть указаны для каждой строки в фрейме данных и что он не обязательно должен быть постоянным. Если размер рынка растет, то “cap” может быть возрастающей последовательностью.
Модель логистического роста также может обрабатывать насыщающий минимум, который указан столбцом “floor” точно так же, как “cap” столбец указывает максимум:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m1, periods = 365)
kurs$cap <- 6
kurs$floor <- 1.5
future$cap <- 6
future$floor <- 1.5
fcst <- predict(m1, future)
plot(m1, fcst)
** Автоматическое обнаружение точки смены в Prophet
Prophet обнаруживает точки смены, сначала указав большое количество потенциальных точек смены, при которых можно изменить скорость. Затем он помещает редкие изменения в величины изменения скорости (что эквивалентно L1-регуляризации) - это по существу означает, что у Prophet есть большое количество возможных мест, где скорость может измениться, но будет использовать как можно меньше из них
Несмотря на то, что у нас есть много мест, где скорость может измениться, из-за разреженного ранее, большинство из этих пунктов замены остаются неиспользованными.
Количество потенциальных точек изменения может быть задано с использованием аргумента “n_changepoints”, но это лучше настраивается путем корректировки регуляризации. Расположение точек смены знака можно визуализировать с помощью:
plot(m, forecast) + add_changepoints_to_plot(m)
По умолчанию контрольные точки выводятся только для первых 80% временных рядов, чтобы иметь много ВПП для прогнозирования тенденции вперед и избежать перерегулирования колебаний в конце временного ряда. Это значение по умолчанию работает во многих ситуациях, но не во всех, и может быть изменено с помощью “changepoint_range” аргумента. Например, m <- prophet(changepoint.range = 0.9) в R будет помещать потенциальные точки изменения в первые 90% временных рядов.
** Настройка гибкости тренда
Если изменения тренда перегружены (слишком большая гибкость) или недостаточно (недостаточно гибкости), вы можете отрегулировать силу разреженного ранее, используя входной аргумент changepoint_prior_scale. По умолчанию этот параметр установлен в 0.05. Увеличение его сделает тенденцию более гибкой:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
plot(m, forecast)
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: absolute parameter change was below tolerance
forecast <- predict(m, future)
plot(m, forecast)
Если вы хотите, а не используя автоматическое обнаружение точки смены, вы можете вручную указать расположение потенциальных точек с “changepoints” аргументами. Изменения склона будут разрешены только в этих точках с той же разреженной регуляризацией, что и раньше. Например, можно создать сетку точек, как это делается автоматически, но затем увеличить эту сетку с определенными датами, которые, как известно, могут иметь изменения. В качестве другого примера, контрольные точки могут быть полностью ограничены небольшим набором дат, как это делается здесь:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
plot(m, forecast)
** Моделирование праздников и специальных событий
Если у вас есть праздники или другие повторяющиеся события, которые вы хотели бы моделировать, вы должны создать для них фреймворк данных. Он имеет две колонки (“holiday” и “ds”) и строку для каждого случая праздника. Он должен включать в себя все события праздника, как в прошлом (до тех пор, пока исторические данные идут), так и в будущем (вне зависимости от прогноза). Если они не будут повторяться в будущем, “Prophet” будет их моделировать, а затем не включать в прогноз.
Вы также можете включить столбцы “lower_window” и “upper_window” продлить праздничные [“lower_window”“,”upper_window“] дни до нескольких дней. Например, если вы хотите включить Рождество в дополнение к Рождеству, которое вы включили бы lower_window=-1,upper_window=0. Если вы хотите использовать Черную пятницу в дополнение ко Дню Благодарения, вы бы включили “lower_window=0” ,“upper_window=1”. Вы также можете включить столбец, “prior_scale” чтобы установить предыдущий масштаб отдельно для каждого праздника, как описано ниже.
Здесь мы создаем фреймворк данных, который включает даты всех выступлений плей-офф Пейтона Мэннинга: (Пока это сделаем для нашей модели цены курса рубля в тенге)
Выше мы включаем суперболочные дни как игра в плей-офф, так и игры в супербол. Это означает, что эффект superbowl будет дополнительным добавочным бонусом поверх эффекта плей-офф.
Когда таблица создана, праздничные эффекты включаются в прогноз, передавая их “holidays” аргументом.
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
Эффект праздника можно увидеть в “forecast” кадре данных:
forecast %>%
select(kurs, playoff, superbowl) %>%
filter(abs(playoff + superbowl) > 0) %>%
tail(10)
Эффекты праздника также будут отображаться на графике компонентов, где мы видим, что в дни вокруг выступлений в плей-офф есть всплеск, особенно сильный всплеск для суперкубка:
prophet_plot_components(m, forecast)
Сезонность оценивается с использованием частичной суммы Фурье. Частичная сумма Фурье может приближаться к произвольному периодическому сигналу. Число членов в частичной сумме (порядок) является параметром, определяющим, насколько быстро может измениться сезонность. Чтобы проиллюстрировать это, рассмотрите данные Пейтона Мэннинга из Quickstart. Стандарт Фурье по умолчанию для годовой сезонности составляет 10, что дает такую форму:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
prophet:::plot_yearly(m)
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
prophet:::plot_yearly(m)
Увеличение числа рядов Фурье позволяет сезонности соответствовать более быстрым изменениям циклов, но также может привести к переопределению: N членов Фурье соответствует 2N переменным, используемым для моделирования цикла
** Определение пользовательских сезонов
Пророк по умолчанию будет соответствовать еженедельной и ежегодной сезонности, если временной цикл длится более двух циклов. Он также будет соответствовать ежедневной сезонности для субодневных временных рядов. Вы можете добавить другие сезоны (ежемесячно, ежеквартально, ежечасно) с помощью “add_seasonality” функции (R)
Входы этой функции - это имя, период сезонности в днях и порядок Фурье для сезонности. Для справки, по умолчанию Пророк использует порядок Фурье 3 для недельной сезонности и 10 для сезонной сезонности. Дополнительным вводом “add_seasonality” является предварительная шкала для этого сезонного компонента - это обсуждается ниже.
Например, здесь мы подходим к данным Peyton Manning из Quickstart, но заменяем недельную сезонность месячной сезонностью. Затем ежемесячная сезонность появится на участке компонентов:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
forecast <- predict(m, future)
prophet_plot_components(m, forecast)
Если вы обнаружите, что праздники переработаны, вы можете настроить их прежнюю шкалу, чтобы сгладить их с помощью параметра “holidays_prior_scale”. По умолчанию этот параметр равен 10, что обеспечивает очень мало регуляризации. Уменьшение этого параметра смягчает праздничные эффекты:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
ds playoff superbowl
1 2010-01-16 0.1302048 0
2 2013-01-12 0.1302048 0
Величина эффекта праздника была уменьшена по сравнению с предыдущим, особенно для суперкубок, у которых было наименьшее количество наблюдений. Существует параметр, “seasonality_prior_scale” который аналогичным образом регулирует степень, в которой модель сезонности будет соответствовать данным.
Предварительные масштабы могут быть установлены отдельно для отдельных праздников, включая столбцы prior_scaleв кадре данных календаря. Предыдущие шкалы для отдельных сезонов могут быть переданы в качестве аргумента “add_seasonality”. Например, предварительная шкала для только недельной сезонности может быть установлена с использованием:
** Дополнительные регрессоры
Дополнительные регрессоры могут быть добавлены к линейной части модели с использованием “add_regressor” метода или функции. Столбец с значением регрессора должен присутствовать как в фреймах данных фитинга, так и в прогнозировании. Например, мы можем добавить дополнительный эффект по воскресеньям во время сезона НФЛ. На участке компонентов этот эффект будет отображаться на участке «extra_regressors»:
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
prophet_plot_components(m, forecast)
По воскресеньям NFL также можно было обработать, используя описанный выше интерфейс «праздники», создав список прошлых и будущих воскресенья NFL. “add_regressor” функция обеспечивает более общий интерфейс для определения дополнительных линейных регрессоров и, в частности, не требует, чтобы регрессор был двоичным индикатором. В качестве регресса можно использовать другой временной ряд, хотя его будущие значения должны быть известны.
“add_regressor” Функция имеет дополнительные аргументы для определения предварительного масштаба (праздник до масштаба используется по умолчанию) и является ли или не стандартизирован регрессора - см с строку документации “?add_regressor” в R. Заметим , что регрессоры должны быть добавлены до подгонки модели.
Дополнительный регресс должен быть известен как для истории, так и для будущих дат. Таким образом, это должно быть либо то, что известно о будущих значениях (таких как “nfl_sunday”), либо то, что отдельно было предсказано в другом месте. Пророк также будет вызывать ошибку, если регрессор будет постоянным на протяжении всей истории, поскольку с ним ничего не подойдет.
В линейный компонент модели вводятся дополнительные регрессоры, поэтому базовая модель состоит в том, что временные ряды зависят от дополнительного регрессора в качестве аддитивного или мультипликативного фактора.
add_regressor
В кадре данных, переданном «fit» и «pred», будет указан столбец с указанным именем, которое будет использоваться как регресс. Когда standardize = ‘auto’, регрессор будет стандартизован, если он не является двоичным. коэффициент регрессии дается ранее с заданным параметром шкалы. Уменьшение прежней шкалы добавит дополнительную регуляризацию. Если предварительная шкала не указана, будет использоваться holiday.prior.scale. Режим может быть указан как «аддитивный» или «мультипликативный». Если не указано, m$seasonality.mode будет использован. «additive» означает, что эффект регресса будет добавлен в тренд, «мультипликативный» означает, что он будет умножать тренд.
add_regressor(m, name, prior.scale = NULL, standardize = "auto", mode = NULL)
m ~ Объект prophet
name ~ Строковое имя регресса
prior.scale ~ Плавающая шкала для нормализованого предществуюшего. Если это не предусмотрено, holidays.prior.scale будут использованы.
standardize ~ укажите, будет ли этот регрессор стандартизован до установки. Возможно ‘auto’ (стандартизировать, если не бинарно), True или False
mode ~ Необязательно, «аддитивный» или «мультипликативный». По умолчанию m$seasonality.mode
Мультипликативный сезонность
** По умолчанию Пророк подходит для присадочных сезонов, что означает, что эффект сезонности добавляется к тенденции получения прогноза.
Initial log joint probability = -18.9686
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, 50, freq = 'm')
forecast <- predict(m, future)
plot(m, forecast)
может моделировать мультипликативную сезонность, задавая " seasonality_mode=‘multiplicative’ “входные аргументы: {data-height=200}
m <- prophet(kurs, seasonality.mode = 'multiplicative')
forecast <- predict(m, future)
plot(m, forecast)
Компонент теперь покажет сезонность в процентах от тенденции:
праздничные эффекты также будут моделироваться как мультипликативные. Любые добавленные сезоны или дополнительные регрессоры по умолчанию будут использовать все, что угодно”seasonality_mode“, но могут быть переопределены путем указания” mode=‘additive’ " или " mode=‘multiplicative’ " в качестве аргумента при добавлении сезонности или регрессора.
Например, этот блок устанавливает мультипликативную функцию сезонности, но включает в себя добавку квартальной сезонности и аддитивный регресс:
m <- prophet(seasonality.mode = 'multiplicative')
m <- add_seasonality(m, 'quarterly', period = 91.25, fourier.order = 8, mode = 'additive')
m <- add_regressor(m, 'regressor', mode = 'additive')
Добавочные и мультипликативные дополнительные регрессоры будут отображаться в отдельных панелях на участке компонентов.
Недневные данные
** Суб-ежедневные данные
Пророк может делать прогнозы для временных рядов с субодневными наблюдениями, передавая в кадре данных временные метки в dsстолбце. Формат временных меток должен быть ГГГГ-ММ-ДД ЧЧ: ММ: СС - см. Пример: Когда используются субодневные данные, ежедневная сезонность автоматически будет соответствовать. Здесь мы подходим к Пророку к данным с 5-минутным разрешением (суточные температуры в Йосемите):
Initial log joint probability = -1444.46
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, periods = 300, freq = 60 * 60)
fcst <- predict(m, future)
plot(m, fcst)
prophet_plot_components(m, fcst)
Предположим, что в приведенном выше наборе данных были наблюдения от 12 до 6:
Initial log joint probability = -467.044
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, periods = 300, freq = 60 * 60)
fcst <- predict(m, future)
plot(m, fcst)
Прогноз кажется довольно плохим, с гораздо большими колебаниями в будущем, чем это было в истории. Проблема здесь в том, что мы применили ежедневный цикл к временному ряду, который имеет только данные для части дня (12-6). Таким образом, ежедневная сезонность остается неограниченной на оставшуюся часть дня и не оценивается хорошо. Решение состоит в том, чтобы делать прогнозы только для окон времени, для которых есть исторические данные. Здесь это означает, что для ограничения “future”" кадра данных требуется время от 12 до 6:
future2 <- future %>%
filter(as.numeric(format(ds, "%H")) < 6)
fcst <- predict(m, future2)
plot(m, fcst)
другим наборам данных с регулярными пробелами в данных. Например, если история содержит только будние дни, то прогнозы следует делать только по будням, так как недельная сезонность не будет хорошо оценена в выходные дни.
*** Диагностика (проверка моделей)
Пророк включает в себя функциональность для перекрестной проверки временных рядов для измерения ошибки прогноза с использованием исторических данных. Это делается путем выбора точек отсечки в истории и для каждого из них подгонка модели с использованием данных только до этой точки отсечки. Затем мы можем сравнить прогнозируемые значения с фактическими значениями.
Эта процедура перекрестной проверки может быть выполнена автоматически для ряда исторических прерываний с использованием “cross_validation” функции. Мы указываем горизонт прогноза (horizon), а затем необязательно размер начального периода обучения (initial) и интервал между датами отсечения (period). По умолчанию начальный период обучения устанавливается в три раза по горизонтали, а отсечки выполняются каждые пол-горизонта.
Результатом “cross_validation”" является кадр данных с истинными значениями yи прогнозируемыми значениями вне выборки yhatна каждую смоделированную дату прогноза и каждую дату отсечения. В частности, делается прогноз для каждой наблюдаемой точки между “cutoff и cutoff + horizon”. Это “dataframe” может быть использован для вычисления меры об ошибках yhatпротив прогноза y.
Пример cross_validation (Перекрёстная модель)
df_cross <- cross_validation(m, initial = 730, period = 180, horizon = 365, units = 'days')
head(df.cv)
“performance_metrics”" Утилита может быть использована для вычисления некоторых полезных статистических данных о производительности прогнозирования (yhat, yhat_lowerи по yhat_upper сравнению с y), в зависимости от расстояния от среза (насколько далеко в будущем предсказании было). Вычисленная статистика представляет собой среднеквадратичную ошибку (MSE), среднеквадратичную ошибку (RMSE), среднюю абсолютную ошибку (MAE), среднюю абсолютную процентную погрешность (MAPE) и охват yhat_lowerи yhat_upperоценки. Они вычисляются по календарю предсказаний df_cv после сортировки по горизонту ( ds минус cutoff). По умолчанию 10% прогнозов будут включены в каждое окно, но это может быть изменено с помощью rolling_window аргумента.
df.p <- performance_metrics(df_cross)
head(df.p)
Показатели производительности перекрестной проверки можно визуализировать с помощью plot_cross_validation_metric здесь, для MAPE. Точки показывают абсолютную процентную погрешность для каждого прогноза df_cv. Синяя линия показывает MAPE, где среднее значение берется по катящемуся окну точек. Мы видим для этого прогноза, что ошибки около 5% типичны для прогнозов на один месяц в будущем, и что ошибки увеличиваются примерно до 11% для прогнозов, которые являются годом.
plot_cross_validation_metric(df.cv, metric = 'mape')
– FUNCTION PROPHET
prophet(df = NULL, growth = "linear", changepoints = NULL,
n.changepoints = 25, changepoint.range = 0.8,
yearly.seasonality = "auto", weekly.seasonality = "auto",
daily.seasonality = "auto", holidays = NULL,
seasonality.mode = "additive", seasonality.prior.scale = 10, holidays.prior.scale = 10, changepoint.prior.scale = 0.05, mcmc.samples = 0, interval.width = 0.8, uncertainty.samples = 1000, fit = TRUE, ...)
df ~ Dataframe, содержащий историю. Должны иметь столбцы ds (тип даты) и y-временные ряды. Если рост логичен, то df также должен иметь колпачок который определяет емкость в каждом ds. Если это не предусмотрено, то объект модели будет быть создан, но не подходит; используйте fit.prophet (m, df), чтобы соответствовать модели.
growth ~ Строка «linear» или «logistic» для указания линейного или логистического тренда.
changepoints ~ Вектор дат, в который должны включаться потенциальные точки изменения. Если не указано, потенциальные точки изменения выбираются автоматически.
n.changepoints ~ Количество потенциальных точек изменения, которые необходимо включить. Не используется, если входные значения “changepoints” в комплект поставки. Если «changepoints» не предоставляется, то n.changepoints потенциальный контрольные точки выбираются равномерно из первого параметра “changepoint.range” df$ds
changepoint.range ~ Пропорция истории, в которой будут оцениваться точки изменения тренда. По умолчанию 0,8 для первых 80 «changepoint»
yearly.seasonality ~ Подходите к ежегодной сезонности. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации
weekly.seasonality ~ Подходите еженедельно. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации.
daily.seasonality ~ Подходит ежедневная сезонность. Может быть «auto», «TRUE», «FALSE» или «Фурье» термины для генерации.
holidays ~ кадр данных с отпусками столбцов (символ) и ds (тип даты) и необязательно столбцы lower_window и upper_window, которые определяют диапазон дней вокруг дата, которая будет включена в качестве праздников. lower_window = -2 будет включать 2 дня до до даты праздников. Также необязательно может иметь столбец before_scale указать- в предыдущей шкале для каждого праздника
seasonality.mode ~ «additive» (по умолчанию) или «multiplicative»
seasonality.prior.scale ~ Параметр, модулирующий силу модели сезонности. Большие значения позволяют модель, чтобы соответствовать более крупным сезонным колебаниям, меньшие значения уменьшают сезонно- Эк. Может быть указано для отдельных сезонов, используя add_seasonality
holidays.prior.scale ~ Параметр, модулирующий силу модели праздничных компонентов, если только переопределяется на входе праздников
changepoint.prior.scale ~ Параметр, модулирующий гибкость выбора автоматической замены. Большие значения позволят многим точкам изменения, малые значения позволят несколько изменений, точки
mcmc.samples ~ Целое число, если оно больше 0, сделает полный байесовский вывод с указанным номером, образцов MCMC. Если 0, будет выполнена оценка MAP
interval.width ~ Числовая, ширина интервалов неопределенности, предусмотренных для прогноза. Если mcmc.samples = 0, это будет только неопределенность в тренде, используя оценку MAP ex- ловушечной генеративной модели. Если mcmc.samples> 0, это будет интегрировано по всем параметры модели, которые будут включать неопределенность в сезонности
uncertainty.samples ~ Количество смоделированных ничьих, используемых для оценки интервалов неопределенности
fit ~ Boolean, если FALSE, модель инициализируется, но не подходит
cross_validation (перекрестная проверка)
Вычисляет прогнозы из исторических точек отсечения. Начиная с (end - horizon), работает в обратном направлении делая отсечки с интервалом периода до достижения первоначального значения
cross_validation (model, horizon, units, period = NULL, initial = NULL)
model ~ Установленная модель prophet
horizon ~ Целочисленный размер горизонта
units ~ Строковая единица горизонта, например, “days”, “secs”
period ~ Целочисленное количество времени между датами отсечения. Те же единицы, что и горизонт (horizon). Если не предоставлено,используется 0,5 * horizon.
initial ~ Целочисленный размер первого периода обучения. Если не предоставлено, используется 3 * horizon. Те же единицы, что и horizon
Выводы: * Библиотека Prophet — удобный инструмент для прогнозирования временных рядов. Модель работает достаточно хорошо, при этом есть набор гиперпараметров, которые позволяют улучшить прогноз. * Отдельно стоит отметить встроенные возможности визуализации. * Задача прогнозировать колебания валюты — сложная. * Prophet хорошо аппроксимирует обучающую выборку. Стоит отметить и разумно выделенную годовую сезонность. * Полученные предсказания можно использовать как новый признак для других алгоритмов машинного обучения. * Из минусов — проект достаточно молодой, возможны какие-то неточности в работе. Неполная документация.
All rights reserved
Flexdashboard - интерактивный инструмент для визуализации данных в R.
*install.packages("flexdashboard")*
library(flexdashboard)
rmarkdown::draft("dashboard.Rmd", template = "flex_dashboard", package = "flexdashboard")
Расположение (Layout)
По умолчанию (——————) , макеты располагаются вертикально по столбцам:
title: "Column Orientation"
output: flexdashboard::flex_dashboard
Можно поменять расположение по строкам, указав
orientation: rows
---
title: "Row Orientation"
output:
flexdashboard::flex_dashboard:
orientation: rows
---
По умолчанию графики автоматически запоняют браузер. Если их несколько, удобнее будет скролить. Для это используем функцию vertical_layout.
fill - графики располагаются на весь браузер
scroll - прокручиваются произвольно, не сжимаясь:
---
title: "Chart Stack (Scrolling)"
output:
flexdashboard::flex_dashboard:
vertical_layout: scroll
---
Используем функцию {.tabset} для создания табуляции:
Column {.tabset}
-------------------------------------
{.tabset-fade} - тени для различения неактивной табуляции
1. HTML Widgets
Framework c динамичными библиотеками JavaScript. Доступные:
В CRAN имеется более 30 пакетов htmlwidgets.
htmlwidgets используются в R Markdown так же, как и обычные графики.
2. R Graphics
Можно использовать любой график, созданный со стандартной графикой R (base, lattice, grid, etc.)
fig.width - указываем ширину графика
fig.height - указываем высоту графика
{r, fig.width=10, fig.height=7}
plot(cars)
3. Tabular Data
Два вида:
knitr::kable{r}
knitr::kable(mtcars)
shiny::renderTable - для пакета Shiny
{r}
renderTable({
head(mtcars, n = input$rows)
})
Data Table
Пакет DT может отображать матрицы или датафрэймы в виде интерактивных HTML-таблиц, которые поддерживают фильтрацию, разбиение на страницы и сортировку.
install.packages("DT")
DT::datatable - функция для добавления DataTable
{r}
DT::datatable(mtcars, options = list(
bPaginate = FALSE
))
bPaginate = FALSE - включение скроллинга при работе с маленькими данными
pageLength - нужно указать при работе с большими данными
{r}
DT::datatable(mtcars, options = list(
pageLength = 25
))
4. Value Boxes
Можно использовать функцию valueBox для отображения отдельных значений вместе с заголовком и дополнительным значком.
{r}
comments <- computeComments()
valueBox(comments, icon = "fa-comments")
Icons:
Использование: ( “fa-github”, “ion-social-twitter”, “glyphicon-time”, etc.)
5. Navigation Bar
По умолчанию панель навигации flexdashboard включает в себя функции: title, author, date.
Еще можно добавить ссылки на соц.сети и код.
---
title: "Social Links and Source code"
output:
flexdashboard::flex_dashboard:
social: [ "twitter", "facebook", "menu" ]
source_code: embed
---
navbar - функция позволяет добавлять любые ссылки:
---
title: "Navigation Bar"
output:
flexdashboard::flex_dashboard:
navbar:
- { title: "About", href: "https://example.com/about", align: left }
---
6. Text Annotations
> - для заметок:
> Monthly deaths from lung disease in the UK, 1974–1979
.no-title - убрать все заголовки:
### All Lung Deaths {.no-title}
1. Ширина и высота
data-width
data-height
{data-height=650}
.no-padding - убрать паддинги
### Chart 1 {.no-padding}
data-padding - указать определенный размер паддинга
### Chart 2 {data-padding=10}
1. Как создать
Последовательность визуализации данных и связанных с ним комментариев.
storyboard: true storyboard: true
---
### Frame 1
{.storyboard} - если хотим использовать только на определенной странице
---
title: "Storyboard Page"
output: flexdashboard::flex_dashboard
---
Analysis {.storyboard}
=========================================
### Frame 1
### Frame 2
Details
=========================================
Column
-----------------------------------------
3. Комментарии
(***) - добавляет комментарии
---
title: "Storyboard Commentary"
output:
flexdashboard::flex_dashboard:
storyboard: true
---
### Frame 1
***
Some commentary about Frame 1.
### Frame 2 {data-commentary-width=400}
***
Some commentary about Frame 2.
data-commentary-width - размер блока комментарий
1. Темы
theme - функция для установления темы
Виды:
---
title: "Themes"
output:
flexdashboard::flex_dashboard:
theme: bootstrap
---
2. Стили CSS
css. - функция позволяет добавлять разные стили css:
Можно использовать Bootswatch, а также https://github.com/rstudio/flexdashboard/tree/feature/logo-and-favicon/inst/rmarkdown/templates/flex_dashboard/resources
title: "Custom CSS"
output:
flexdashboard::flex_dashboard:
css: styles.css
3. Логотип и Фавикон
Основные функции:
logo
favicon
---
logo: logo.png
favicon: favicon.png
---